{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# [Introduction to Julia (slides show)](../portfolio/Introduction to Julia.slides.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start with a quick overview of the basic syntax, emphasising differences with Python."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "[Why Jula (slides show)](../portfolio/Why Julia.slides.html)\n",
    "\n",
    "<!-- TEASER_END -->\n",
    "\n",
    "- David P. Sanders\n",
    "- Department of Physics, Faculty of Sciences\n",
    "- National University of Mexico (UNAM)\n",
    "- Twitter: @DavidPSanders\n",
    "- GitHub: dpsanders"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# [Variables](http://docs.julialang.org/en/release-0.3/manual/variables/) and arithmetic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Numeric values in Julia work similarly to Python:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "Variables in Julia are created as in Python, with a simple assignment operation; variable names can be *arbitrary unicode characters*. Many may be entered in LaTeX notation, using tab substitution: type `\\alpha<TAB>`. There is also tab completion on partial names: `\\alp<TAB>`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "α = 3; ℵ = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Functions use parentheses (round brackets, `()`) around the arguments being passed. `println` prints its arguments, followed by a new line. [`print` omits the new line.] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "α = 3\n"
     ]
    }
   ],
   "source": [
    "println(\"α = \", α)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Simple functions may be defined with a nice mathematical syntax; `*` is not needed in simple expressions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "g (generic function with 1 method)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x) = 2x^2 + 3x + 1\n",
    "g(x) = f(x) - (2x+1)*(x+1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "28"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(3.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Variable substitution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "The values of variables may be substituted into strings in a simple way using the `$` operator:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, David\n"
     ]
    }
   ],
   "source": [
    "# Variable substitution with $:\n",
    "name = \"David\"\n",
    "greeting = \"Hello, $name\"\n",
    "println(greeting)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "More complicated expressions are wrapped in parentheses:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The sine of 3 is 0.1411200080598672\n"
     ]
    }
   ],
   "source": [
    "μ = 3\n",
    "println(\"The sine of $μ is $(sin(μ))\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Numerical types"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are numerical types with different precisions: typing `Float<TAB>` or `Int<TAB>` will provide a list. Currently, in arithmetic calculations types are promoted to the machine type. (This looks likely to change soon.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Machine integers!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100000000000000000"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = int(1e16)\n",
    "a * 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = int8(1)\n",
    "b = int8(2)\n",
    "a + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int8"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(ans) # ans is the last result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "These promotion rules are defined in `int.jl`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Arbitrary-precision arithmetic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Arbitrary-precision integers and floating points are available through the types `BigInt` and `BigFloat`. The function `big` converts a number into the corresponding `Big` type:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "big(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BigInt (constructor with 10 methods)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(ans)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that, unlike in Python, integers *are not* automatically promoted to arbitrary-precision integers."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "----\n",
    "**Exercise**: Calculate powers of 10 using standard integers and `BigInt`s\n",
    "\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1000000000000000000"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10^18"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "syntax: use \"^\" instead of \"**\"\nwhile loading In[16], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "syntax: use \"^\" instead of \"**\"\nwhile loading In[16], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "10**5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-8446744073709551616"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10^19"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ten = big(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ten^109"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i = int8(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "110"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i * big(11)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BigInt (constructor with 10 methods)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(ans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9223372036854775807"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typemax(Int64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9223372036854775807"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2^63-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-9223372036854775808"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typemin(Int64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-9223372036854775808"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "-2^63"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Complex numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Complex numbers are written using `im` for the imaginary part:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.0 + 24.5im"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 7\n",
    "c = (1+3.5im) * a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "24.5"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.im"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(7.0,24.5)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.re, c.im"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "649.25 + 0.0im"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c * conj(c)  # conj is a function that returns the conjugate of a complex number"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(Tuples behave similarly to Python.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Rational numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rational numbers are also built into Julia; they are created using the `//` operator:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3//4"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3//4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rational{Int64} (constructor with 1 method)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(ans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "717897987691852588770249//1267650600228229401496703205376"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(big(3)//4)^50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rational{BigInt} (constructor with 1 method)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(ans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "19//12"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3//4 + 5//6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Operators are a convenient way of writing functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(3, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3//4"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "//(3, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "// (generic function with 8 methods)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "//"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "We see that `//` is a *function*, implemented as a series of *methods*. We can see what these methods are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "8 methods for generic function <b>//</b>:<ul><li> //(n::<b>Integer</b>,d::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L15\" target=\"_blank\">rational.jl:15</a><li> //(x::<b>Rational{T<:Integer}</b>,y::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L16\" target=\"_blank\">rational.jl:16</a><li> //(x::<b>Integer</b>,y::<b>Rational{T<:Integer}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L17\" target=\"_blank\">rational.jl:17</a><li> //(x::<b>Rational{T<:Integer}</b>,y::<b>Rational{T<:Integer}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L18\" target=\"_blank\">rational.jl:18</a><li> //(x::<b>Complex{T<:Real}</b>,y::<b>Real</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L19\" target=\"_blank\">rational.jl:19</a><li> //(x::<b>Real</b>,y::<b>Complex{T<:Real}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L20\" target=\"_blank\">rational.jl:20</a><li> //(x::<b>Complex{T<:Real}</b>,y::<b>Complex{T<:Real}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L23\" target=\"_blank\">rational.jl:23</a><li> //(X::<b>AbstractArray{T,N}</b>,y::<b>Number</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L28\" target=\"_blank\">rational.jl:28</a></ul>"
      ],
      "text/plain": [
       "# 8 methods for generic function \"//\":\n",
       "//(n::Integer,d::Integer) at rational.jl:15\n",
       "//(x::Rational{T<:Integer},y::Integer) at rational.jl:16\n",
       "//(x::Integer,y::Rational{T<:Integer}) at rational.jl:17\n",
       "//(x::Rational{T<:Integer},y::Rational{T<:Integer}) at rational.jl:18\n",
       "//(x::Complex{T<:Real},y::Real) at rational.jl:19\n",
       "//(x::Real,y::Complex{T<:Real}) at rational.jl:20\n",
       "//(x::Complex{T<:Real},y::Complex{T<:Real}) at rational.jl:23\n",
       "//(X::AbstractArray{T,N},y::Number) at rational.jl:28"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(//)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-31"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3 + -34"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The expression `n::Integer` is a *type annotation* that specifies that the method applies when its first argument is of type `Integer`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Clicking on the file name takes us directly to the Julia standard library source code on GitHub where these functions are defined!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Vectors: an \"equivalent\" of Python lists *and* `numpy` arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "To store several values \"in one variable\", we can try to imitate using a \"list\" as we would in Python:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Int64,1}:\n",
       " 3\n",
       " 4\n",
       " 5"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3, 4, 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Array{Int64,1}"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(l)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In Julia these objects are called `Array`s. The curly braces indicate type parameters of the `Array` type. The first is the type of element contained in the `Array` (all must be of the same type) and the second the number of dimensions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "----\n",
    "**Exercise**: Try to create an array in this way with elements of different types. What happens?\n",
    "\n",
    "\n",
    "**Exercise**: What does the following syntax do?:  `l = {3, 4, 7.5}`\n",
    "\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " 3.0\n",
       " 4.0\n",
       " 7.5"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3, 4, 7.5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " 3.0\n",
       " 4.0\n",
       " 5.0"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3., 4, 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Any,1}:\n",
       " 3.0 \n",
       "  \"a\""
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3., \"a\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Float64,1}:\n",
       "  3.0\n",
       " 97.0"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3., 'a']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Any,1}:\n",
       " 3.0     \n",
       " 4       \n",
       "  \"hello\"\n",
       "  [3,4]  "
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = {3., 4, \"hello\", [3, 4]}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Indexing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The indices of Julia arrays are numbered starting at 1, unlike Python (where they are numbered starting at 0)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.0"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l[1]  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The syntax for ranges is similar to that for Python:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Any,1}:\n",
       " 3.0\n",
       " 4  "
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l[1:2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "However, the limits must be explicitly specified:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Any,1}:\n",
       " 4       \n",
       "  \"hello\"\n",
       "  [3,4]  "
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l[2:end]   # Use `end` explicitly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Any,1}:\n",
       " 3.0     \n",
       " 4       \n",
       "  \"hello\""
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l[1:end-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "BoundsError()\nwhile loading In[52], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "BoundsError()\nwhile loading In[52], in expression starting on line 1",
      "",
      " in getindex_3B_2413 at /home/tj2/Documents/julia/usr/bin/../lib/julia/sys.so"
     ]
    }
   ],
   "source": [
    "l[-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Julia `Arrays`, like Python lists, but unlike `numpy` arrays, are dynamic. However, the syntax is rather different from Python -- to add an element at the end of the list, we write"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Int64,1}:\n",
       "  6\n",
       "  8\n",
       " 10"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3,4,5]\n",
    "l + l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0-element Array{Any,1}"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Int64,1}:\n",
       " 3\n",
       " 4\n",
       " 5\n",
       " 7"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3, 4, 5]\n",
    "\n",
    "push!(l, 7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "11 methods for generic function <b>sizehint</b>:<ul><li> sizehint(a::<b>Array{T,1}</b>,sz::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/array.jl#L495\" target=\"_blank\">array.jl:495</a><li> sizehint(B::<b>BitArray{1}</b>,sz::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/bitarray.jl#L514\" target=\"_blank\">bitarray.jl:514</a><li> sizehint(s::<b>IntSet</b>,top::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/intset.jl#L18\" target=\"_blank\">intset.jl:18</a><li> sizehint(d::<b>Dict{K,V}</b>,newsz) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/dict.jl#L445\" target=\"_blank\">dict.jl:445</a><li> sizehint(s::<b>Set{T}</b>,newsz) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/set.jl#L29\" target=\"_blank\">set.jl:29</a><li> sizehint(d::<b>HashDict{K,V,O<:Union(Int64,Void)}</b>,newsz) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/hashdict.jl#L224\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/hashdict.jl:224</a><li> sizehint(::<b>OrderedDict{K,V}</b>,...) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/delegate.jl#L11\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11</a><li> sizehint(::<b>OrderedSet{T}</b>,...) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/delegate.jl#L11\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11</a><li> sizehint(::<b>DefaultDictBase{K,V,F,D<:Associative{K,V}}</b>,...) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/delegate.jl#L11\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11</a><li> sizehint(::<b>DefaultDict{K,V,F}</b>,...) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/delegate.jl#L11\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11</a><li> sizehint(::<b>DefaultOrderedDict{K,V,F}</b>,...) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/delegate.jl#L11\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11</a></ul>"
      ],
      "text/plain": [
       "# 11 methods for generic function \"sizehint\":\n",
       "sizehint(a::Array{T,1},sz::Integer) at array.jl:495\n",
       "sizehint(B::BitArray{1},sz::Integer) at bitarray.jl:514\n",
       "sizehint(s::IntSet,top::Integer) at intset.jl:18\n",
       "sizehint(d::Dict{K,V},newsz) at dict.jl:445\n",
       "sizehint(s::Set{T},newsz) at set.jl:29\n",
       "sizehint(d::HashDict{K,V,O<:Union(Int64,Void)},newsz) at /home/tj2/.julia/v0.4/DataStructures/src/hashdict.jl:224\n",
       "sizehint(::OrderedDict{K,V},...) at /home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11\n",
       "sizehint(::OrderedSet{T},...) at /home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11\n",
       "sizehint(::DefaultDictBase{K,V,F,D<:Associative{K,V}},...) at /home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11\n",
       "sizehint(::DefaultDict{K,V,F},...) at /home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11\n",
       "sizehint(::DefaultOrderedDict{K,V,F},...) at /home/tj2/.julia/v0.4/DataStructures/src/delegate.jl:11"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(sizehint)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "push! (generic function with 22 methods)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "push!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "22 methods for generic function <b>push!</b>:<ul><li> push!(a::<b>Array{Any,1}</b>,item) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/array.jl#L458\" target=\"_blank\">array.jl:458</a><li> push!<i>{T}</i>(a::<b>Array{T,1}</b>,item) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/array.jl#L451\" target=\"_blank\">array.jl:451</a><li> push!(B::<b>BitArray{1}</b>,item) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/bitarray.jl#L454\" target=\"_blank\">bitarray.jl:454</a><li> push!(s::<b>IntSet</b>,n::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/intset.jl#L32\" target=\"_blank\">intset.jl:32</a><li> push!(::<b>EnvHash</b>,k::<b>String</b>,v) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/env.jl#L114\" target=\"_blank\">env.jl:114</a><li> push!(t::<b>Associative{K,V}</b>,key,v) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/dict.jl#L241\" target=\"_blank\">dict.jl:241</a><li> push!(s::<b>Set{T}</b>,x) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/set.jl#L18\" target=\"_blank\">set.jl:18</a><li> push!<i>{T}</i>(q::<b>Deque{T}</b>,x) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/deque.jl#L189\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/deque.jl:189</a><li> push!(s::<b>Stack{S}</b>,x) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/stack.jl#L16\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/stack.jl:16</a><li> push!<i>{T,V<:Number,V2<:Number}</i>(ct::<b>Accumulator{T,V<:Number}</b>,r::<b>Accumulator{T,V2<:Number}</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/accumulator.jl#L50\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:50</a><li> push!<i>{T,V<:Number}</i>(ct::<b>Accumulator{T,V<:Number}</b>,x::<b>T</b>,a::<b>V<:Number</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/accumulator.jl#L45\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:45</a><li> push!<i>{T,V<:Number,V2<:Number}</i>(ct::<b>Accumulator{T,V<:Number}</b>,x::<b>T</b>,a::<b>V2<:Number</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/accumulator.jl#L46\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:46</a><li> push!<i>{T,V<:Number}</i>(ct::<b>Accumulator{T,V<:Number}</b>,x::<b>T</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/accumulator.jl#L47\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:47</a><li> push!<i>{K,C}</i>(cc::<b>ClassifiedCollections{K,C}</b>,key::<b>K</b>,e) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/classifiedcollections.jl#L44\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/classifiedcollections.jl:44</a><li> push!(s::<b>IntDisjointSets</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/disjoint_set.jl#L82\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/disjoint_set.jl:82</a><li> push!<i>{T}</i>(s::<b>DisjointSets{T}</b>,x::<b>T</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/disjoint_set.jl#L127\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/disjoint_set.jl:127</a><li> push!<i>{T}</i>(h::<b>BinaryHeap{T,Comp}</b>,v::<b>T</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/heaps/binary_heap.jl#L138\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/heaps/binary_heap.jl:138</a><li> push!<i>{T}</i>(h::<b>MutableBinaryHeap{T,Comp}</b>,v::<b>T</b>) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/heaps/mutable_binary_heap.jl#L201\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/heaps/mutable_binary_heap.jl:201</a><li> push!(s::<b>OrderedSet{T}</b>,x) at <a href=\"https://github.com/JuliaLang/DataStructures.jl/tree/b4aea82ce1cf165b96115f9271efd33776435fe0/src/orderedset.jl#L26\" target=\"_blank\">/home/tj2/.julia/v0.4/DataStructures/src/orderedset.jl:26</a><li> push!(A) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/abstractarray.jl#L1384\" target=\"_blank\">abstractarray.jl:1384</a><li> push!(A,a,b) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/abstractarray.jl#L1385\" target=\"_blank\">abstractarray.jl:1385</a><li> push!(A,a,b,c...) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/abstractarray.jl#L1386\" target=\"_blank\">abstractarray.jl:1386</a></ul>"
      ],
      "text/plain": [
       "# 22 methods for generic function \"push!\":\n",
       "push!(a::Array{Any,1},item) at array.jl:458\n",
       "push!{T}(a::Array{T,1},item) at array.jl:451\n",
       "push!(B::BitArray{1},item) at bitarray.jl:454\n",
       "push!(s::IntSet,n::Integer) at intset.jl:32\n",
       "push!(::EnvHash,k::String,v) at env.jl:114\n",
       "push!(t::Associative{K,V},key,v) at dict.jl:241\n",
       "push!(s::Set{T},x) at set.jl:18\n",
       "push!{T}(q::Deque{T},x) at /home/tj2/.julia/v0.4/DataStructures/src/deque.jl:189\n",
       "push!(s::Stack{S},x) at /home/tj2/.julia/v0.4/DataStructures/src/stack.jl:16\n",
       "push!{T,V<:Number,V2<:Number}(ct::Accumulator{T,V<:Number},r::Accumulator{T,V2<:Number}) at /home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:50\n",
       "push!{T,V<:Number}(ct::Accumulator{T,V<:Number},x::T,a::V<:Number) at /home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:45\n",
       "push!{T,V<:Number,V2<:Number}(ct::Accumulator{T,V<:Number},x::T,a::V2<:Number) at /home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:46\n",
       "push!{T,V<:Number}(ct::Accumulator{T,V<:Number},x::T) at /home/tj2/.julia/v0.4/DataStructures/src/accumulator.jl:47\n",
       "push!{K,C}(cc::ClassifiedCollections{K,C},key::K,e) at /home/tj2/.julia/v0.4/DataStructures/src/classifiedcollections.jl:44\n",
       "push!(s::IntDisjointSets) at /home/tj2/.julia/v0.4/DataStructures/src/disjoint_set.jl:82\n",
       "push!{T}(s::DisjointSets{T},x::T) at /home/tj2/.julia/v0.4/DataStructures/src/disjoint_set.jl:127\n",
       "push!{T}(h::BinaryHeap{T,Comp},v::T) at /home/tj2/.julia/v0.4/DataStructures/src/heaps/binary_heap.jl:138\n",
       "push!{T}(h::MutableBinaryHeap{T,Comp},v::T) at /home/tj2/.julia/v0.4/DataStructures/src/heaps/mutable_binary_heap.jl:201\n",
       "push!(s::OrderedSet{T},x) at /home/tj2/.julia/v0.4/DataStructures/src/orderedset.jl:26\n",
       "push!(A) at abstractarray.jl:1384\n",
       "push!(A,a,b) at abstractarray.jl:1385\n",
       "push!(A,a,b,c...) at abstractarray.jl:1386"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(push!)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "InexactError()\nwhile loading In[60], in expression starting on line 2",
     "output_type": "error",
     "traceback": [
      "InexactError()\nwhile loading In[60], in expression starting on line 2",
      "",
      " in push! at array.jl:451"
     ]
    }
   ],
   "source": [
    "l = [3, 4, 5]\n",
    "push!(l, 12.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Float64,1}:\n",
       "  3.0  \n",
       "  4.0  \n",
       "  5.0  \n",
       " 12.001"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3.0, 4, 5]\n",
    "push!(l, 12.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "12.0 == 12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5-element Array{Float64,1}:\n",
       "  3.0  \n",
       "  4.0  \n",
       "  5.0  \n",
       " 12.001\n",
       " 12.1  "
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "push!(l, 12.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7-element Array{Int64,1}:\n",
       "  3\n",
       "  4\n",
       "  5\n",
       " 12\n",
       " 10\n",
       " 11\n",
       " 12"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = [3, 4, 5, 12]\n",
    "append!(l, [10., 11., 12])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "`push!` replaces `append` in Python. There are no methods of objects as in Python; rather, we use functions and send the object as an argument of the function.\n",
    "\n",
    "The exclamation mark, or *bang*, (`!`) indicates that the function modifies its argument; this is a standard convention in Julia."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Arrays which have been defined with a certain type *cannot* acquire elements of a different type:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`convert` has no method matching convert(::Type{Int64}, ::ASCIIString)\nwhile loading In[65], in expression starting on line 2",
     "output_type": "error",
     "traceback": [
      "`convert` has no method matching convert(::Type{Int64}, ::ASCIIString)\nwhile loading In[65], in expression starting on line 2",
      "",
      " in push! at array.jl:451"
     ]
    }
   ],
   "source": [
    "l = [3, 4, 5]\n",
    "push!(l, \"hello\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Array`s work as mathematical vectors, with the sum of two vectors and scalar multiplication being defined:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " 4.4\n",
       " 5.5\n",
       " 6.6"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = [1.1, 2.2, 3.3]\n",
    "b = [4.4, 5.5, 6.6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " 5.5\n",
       " 7.7\n",
       " 9.9"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       "  3.85\n",
       "  7.7 \n",
       " 11.55"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3.5 * a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "However, operators are, in general, *not* treated in an elementwise fashion (as they would be e.g. in `numpy`):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`*` has no method matching *(::Array{Float64,1}, ::Array{Float64,1})\nwhile loading In[69], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`*` has no method matching *(::Array{Float64,1}, ::Array{Float64,1})\nwhile loading In[69], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "a * b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rather, elementwise operations use a Matlab-like syntax, with an extra `.` before the symbol for the operator:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       "  4.84\n",
       " 12.1 \n",
       " 21.78"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a .* b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "There are many useful operations on vectors predefined, without needing to explicitly import them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "38.72"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot(a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dot (generic function with 7 methods)\n"
     ]
    }
   ],
   "source": [
    "?dot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " -3.63\n",
       "  7.26\n",
       " -3.63"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross(a, b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cross (generic function with 1 method)\n"
     ]
    }
   ],
   "source": [
    "?cross"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.115823125451335"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "norm(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.norm(A[, p])\n",
      "\n",
      "   Compute the \"p\"-norm of a vector or the operator norm of a matrix\n",
      "   \"A\", defaulting to the \"p=2\"-norm.\n",
      "\n",
      "   For vectors, \"p\" can assume any numeric value (even though not\n",
      "   all values produce a mathematically valid vector norm). In\n",
      "   particular, \"norm(A, Inf)\" returns the largest value in\n",
      "   \"abs(A)\", whereas \"norm(A, -Inf)\" returns the smallest.\n",
      "\n",
      "   For matrices, valid values of \"p\" are \"1\", \"2\", or \"Inf\".\n",
      "   (Note that for sparse matrices, \"p=2\" is currently not\n",
      "   implemented.) Use \"vecnorm()\" to compute the Frobenius norm.\n"
     ]
    }
   ],
   "source": [
    "?norm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Use `help` or `?` (before the command) to obtain help:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dot (generic function with 7 methods)\n"
     ]
    }
   ],
   "source": [
    "help(dot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dot (generic function with 7 methods)\n"
     ]
    }
   ],
   "source": [
    "?dot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x3 Array{Float64,2}:\n",
       " 1.1  2.2  3.3"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transpose(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x3 Array{Float64,2}:\n",
       " 1.1  2.2  3.3"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transpose(a) == a'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Int64,1}:\n",
       " 2\n",
       " 1\n",
       " 1\n",
       " 1"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = [[2,1], [1,1]] # 1-d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4-element Array{Int64,1}:\n",
       "  3\n",
       "  4\n",
       "  5\n",
       " 12"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "push!(l, 12.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Float64,2}:\n",
       " 2.0  1.0\n",
       " 1.0  1.0"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = [2. 1; 1 1] # 2-d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2x2 Array{Int64,3}:\n",
       "[:, :, 1] =\n",
       " 1  3\n",
       " 2  4\n",
       "\n",
       "[:, :, 2] =\n",
       " 5  7\n",
       " 6  8"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = reshape([1:8], (2,2,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "38.72"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a ⋅ b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot(a,b) == a ⋅ b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Float64,1}:\n",
       " -3.63\n",
       "  7.26\n",
       " -3.63"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a × b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross(a,b) == a × b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "I used `\\cdot`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dot (generic function with 7 methods)"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "⋅"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Note that in the Julia command-line REPL, typing `?` puts it immediately into a special help mode. Similarly, `;` puts it into shell mode, in which commands are sent straight to the shell.]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Control flow: drop the colon (`:`) and add `end`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "White space in Julia is *not* significant. Commands on one line can be separated by `;`. Blocks *must* finish with `end`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\t1\t2\t3\t4\t"
     ]
    }
   ],
   "source": [
    "i = 0\n",
    "while i < 5 \n",
    "    print(\"$i\\t\")\n",
    "    i += 1\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sum is 134217726\n"
     ]
    }
   ],
   "source": [
    "total = 0\n",
    "for i = 1:26\n",
    "    total += 2^i\n",
    "end\n",
    "println(\"Sum is $total\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, `1:26` is a *range object* which may be iterated over."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "UnitRange{Int64} (constructor with 1 method)"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(1:10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "We can construct an array from this by enclosing it in square brackets:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10-element Array{Int64,1}:\n",
       "  1\n",
       "  2\n",
       "  3\n",
       "  4\n",
       "  5\n",
       "  6\n",
       "  7\n",
       "  8\n",
       "  9\n",
       " 10"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(1:10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.collect(collection)\n",
      "\n",
      "   Return an array of all items in a collection. For associative\n",
      "   collections, returns (key, value) tuples.\n",
      "\n",
      "Base.collect(element_type, collection)\n",
      "\n",
      "   Return an array of type \"Array{element_type,1}\" of all items in a\n",
      "   collection.\n"
     ]
    }
   ],
   "source": [
    "?collect"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6-element Array{Int64,1}:\n",
       "  1\n",
       "  3\n",
       "  5\n",
       "  7\n",
       "  9\n",
       " 17"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[1:2:10, 17]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.LinAlg.BLAS.dot(n, X, incx, Y, incy)\n",
      "\n",
      "   Dot product of two vectors consisting of \"n\" elements of array\n",
      "   \"X\" with stride \"incx\" and \"n\" elements of array \"Y\" with\n",
      "   stride \"incy\".\n"
     ]
    }
   ],
   "source": [
    "help(\"dot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "**Exercise**: Implement the Babylonian method for calculating the square root of a positive number $y$, via the iteration \n",
    "$$x_{n+1} = \\textstyle \\frac{1}{2} (x_n + \\frac{y}{x_n})$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1: 4//1 is 4e+00\n",
      "2: 23//8 is 2.875e+00\n",
      "3: 977//368 is 2.654891304347826086956521739130434782608695652173913043478260869565217391304333e+00\n",
      "4: 1902497//719072 is 2.645767044190289706733122691469004494682034622402207289395220506430510435672636e+00\n",
      "5: 7238946623297//2736064645568 is 2.645751311111369320474788060415261270876928274529823742547961659814056687694087e+00\n",
      "6: 104804696428033056657448577//39612451854313553433195392 is 2.645751311064590590502029293938515493859933284910652657274139597282698886360655e+00\n",
      "7: 21968048786744329890159858491687242656637852949560577//8303141982722814210287293056980408998691454066714368 is 2.645751311064590590501615753639260425710259215401356797324429072042618334785781e+00\n",
      "8: 965190334993558048952747224707737662553546023969581717336893753948305178090306054973804711697153676048897//364807656319439656893574197813762741889129729119092813240115363343939412817707718620985339231655544540672 is 2.645751311064590590501615753639260425710259183082450180368334459201068823230298e+00\n",
      "9: 1863184765529953614442676969410516768705348877426018592874619682164981370927579559773987864606096009580887559742891544147556039040815814753743851100010309178655530447444083262328821461724034060383304637370397697//704217648022349512771442189018194725339511495157190929516136319260161990261007461575776992568187313708188185637682782310132281240170939460318854442124039911242297405920199037531309472261446561026954943354477568 is 2.645751311064590590501615753639260425710259183082450180368334459201068823230264e+00\n",
      "10: 6942914941005816452906820447809898528401948252945007180207641686978710969653763380353810662539739407094605662843293836754945636431635508103618963852112274901648239421682834044604657380796983687411621541616911160282084512012755071820846262756649514791264502834906610162581301591431279046989968494539999498942229056113659738389773073293970820133886115413882850641756087247746883347629340780021440048884451568277591449266177//2624175186825153359249378049906502688043810272014845844292434248994264560667710669982033339453245573538963306071655131184848403463172113026723021373675261241203122087530398269881154662495920113030441863771241633914463530742637259717641425928569498576675875622441689707127692085122998906191651056070668909263006767739390431278990942834266700554990212884068483635241604906439758589382529929519521217527464936293523650721792 is 2.645751311064590590501615753639260425710259183082450180368334459201068823230264e+00\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "2.6457513110645907"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = 7\n",
    "# Babylonian method\n",
    "r1 = big(x)\n",
    "for i=1:10\n",
    "    r2 = (r1+x//r1)//2\n",
    "    r1 = r2\n",
    "    println(\"$i: $r2 is $(float(r2))\")\n",
    "end\n",
    "sqrt(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "norm (generic function with 15 methods)"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "♆ = norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.115823125451335"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "♆(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "snowman (generic function with 1 method)"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "snowman(x) = x^3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "☃ = snowman\n",
    "☃(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Short-circuit evaluation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small\n",
      "Small\n",
      "small, if-then\n"
     ]
    }
   ],
   "source": [
    "a = 3\n",
    "a < 5 && println(\"Small\")   # evaluate the second statement only if the first is true;  semantics of if-then\n",
    "\n",
    "a > 10 || println(\"Small\")  # semantics of if not-then\n",
    "\n",
    "# equal to\n",
    "\n",
    "if a < 5\n",
    "    println(\"small, if-then\")\n",
    "end\n",
    "\n",
    "if a > 10\n",
    "    println(\"small, if not-then\")\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello\n",
      "small, if-then\n"
     ]
    }
   ],
   "source": [
    "a == 3 ? println(\"Hello\") : println(\"Not true\")\n",
    "\n",
    "# equal to\n",
    "\n",
    "if a < 5\n",
    "    println(\"small, if-then\")\n",
    "else\n",
    "    println(\"small, if not-then\")\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Array comprehensions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is an equivalent of list comprehensions in Python, as follows. Note that the array construction syntax is quite flexible."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6-element Array{Any,1}:\n",
       "  1\n",
       "  9\n",
       " 25\n",
       " 49\n",
       " 81\n",
       " 49"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "squares = [i^2 for i in [1:2:10, 7]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5x5 Array{Int64,2}:\n",
       " 2  3  4  5   6\n",
       " 3  4  5  6   7\n",
       " 4  5  6  7   8\n",
       " 5  6  7  8   9\n",
       " 6  7  8  9  10"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sums = [i+j for i=1:5, j=1:5] # boardcasting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5x5x5 Array{Int64,3}:\n",
       "[:, :, 1] =\n",
       " 3  4  5   6   7\n",
       " 4  5  6   7   8\n",
       " 5  6  7   8   9\n",
       " 6  7  8   9  10\n",
       " 7  8  9  10  11\n",
       "\n",
       "[:, :, 2] =\n",
       " 4  5   6   7   8\n",
       " 5  6   7   8   9\n",
       " 6  7   8   9  10\n",
       " 7  8   9  10  11\n",
       " 8  9  10  11  12\n",
       "\n",
       "[:, :, 3] =\n",
       " 5   6   7   8   9\n",
       " 6   7   8   9  10\n",
       " 7   8   9  10  11\n",
       " 8   9  10  11  12\n",
       " 9  10  11  12  13\n",
       "\n",
       "[:, :, 4] =\n",
       "  6   7   8   9  10\n",
       "  7   8   9  10  11\n",
       "  8   9  10  11  12\n",
       "  9  10  11  12  13\n",
       " 10  11  12  13  14\n",
       "\n",
       "[:, :, 5] =\n",
       "  7   8   9  10  11\n",
       "  8   9  10  11  12\n",
       "  9  10  11  12  13\n",
       " 10  11  12  13  14\n",
       " 11  12  13  14  15"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sums = [i+j+k for i=1:5, j=1:5, k=1:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Square brackets with commas gives a one-dimensional vector. This is printed in a way that treats it as if it were a column vector (although there is in fact no difference between a *one-dimensional* row vector and column vector)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3-element Array{Int64,1}:\n",
       " 3\n",
       " 4\n",
       " 5"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = [3, 4, 5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To create explicit matrices, Matlab-style notation is used. If we omit the commas, something different happens: we now obtain a *two-dimensional* `Array`, i.e. a matrix, of size $1 \\times n$. [Recall that in the standard notation for matrices, an $m \\times n$ matrix has $m$ *rows* and $n$ *columns*.]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x3 Array{Int64,2}:\n",
       " 3  4  5"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "row_vec = [3 4 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "false"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v == row_vec"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "We can also use the transpose operator, `'`. [This is actually the *conjugate*-transpose operator, which also takes the complex conjugate of complex numbers. Transpose without conjugate is denoted `.'`]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x2 Array{Complex{Int64},2}:\n",
       " 0-2im  2+0im"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "row_vec = [2im, 2]'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x2 Array{Complex{Int64},2}:\n",
       " 0+2im  2+0im"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "row_vec = [2im, 2].'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A complete matrix may be constructed using a semicolon (`;`) to separate rows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Complex{Int64},2}:\n",
       " 1+0im  0+2im\n",
       " 3+0im  4+0im"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = [1 2im; 3 4]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "As in `numpy`, it may also be created using a `reshape`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Int64,2}:\n",
       " 1  3\n",
       " 2  4"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = reshape([1 2 3 4], (2,2))\n",
    "\n",
    "# equal to\n",
    "\n",
    "N = reshape([1, 2, 3, 4], (2,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M == N"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Here, as in Python, `(2,2)` denotes an (immutable) tuple:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Int64,Int64)"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = (2, 2)\n",
    "typeof(t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is an important difference in the way that Python and Julia treat slices of matrices. While in Python a one-dimensional slice in either direction returns a 1-dimensional vector, in Julia there is a difference. A vertical one-dimensional slice gives a 1-dimensional vector (a \"column vector\"):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Int64,1}:\n",
       " 1\n",
       " 2"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M[:,1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "However, a horizontal one-dimensional slice produces a $1 \\times n$ matrix:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x2 Array{Int64,2}:\n",
       " 1  3"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M[1,:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is the same result that is produced using the following Matlab-like syntax:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1x2 Array{Int64,2}:\n",
       " 1  2"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[1 2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Random numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Mersenne Twister (pseudo-)random number generator is built-in to Julia:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.40186768641976944"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5-element Array{Float64,1}:\n",
       " 0.344519\n",
       " 0.617192\n",
       " 0.829609\n",
       " 0.981215\n",
       " 0.477052"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rand(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5x5 Array{Float64,2}:\n",
       " 0.634627  0.121441   0.793247  0.78431   0.965882\n",
       " 0.989307  0.616908   0.353485  0.710715  0.635409\n",
       " 0.352762  0.118025   0.185011  0.280691  0.28924 \n",
       " 0.748569  0.195795   0.279713  0.831955  0.888495\n",
       " 0.765     0.0837347  0.537341  0.429161  0.147381"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = rand(5, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3x3 Array{Int32,2}:\n",
       "  -113324951   196613133  -1363228423\n",
       " -2088630349  1597727404   -358295295\n",
       " -1080816523  1898363541    571418313"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = rand(Int32,3,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.rand() -> Float64\n",
      "\n",
      "   Generate a \"Float64\" random number uniformly in [0,1)\n",
      "\n",
      "Base.rand(rng::AbstractRNG[, dims...])\n",
      "\n",
      "   Generate a random \"Float64\" number or array of the size specified\n",
      "   by dims, using the specified RNG object. Currently,\n",
      "   \"MersenneTwister\" is the only available Random Number Generator\n",
      "   (RNG), which may be seeded using srand.\n",
      "\n",
      "Base.rand(dims or [dims...])\n",
      "\n",
      "   Generate a random \"Float64\" array of the size specified by dims\n",
      "\n",
      "Base.rand(t::Type[, dims...])\n",
      "\n",
      "   Generate a random number or array of random numbes of the given\n",
      "   type.\n",
      "\n",
      "Base.rand(r[, dims...])\n",
      "\n",
      "   Pick a random element or array of random elements from range \"r\"\n",
      "   (for example, \"1:n\" or \"0:2:10\").\n"
     ]
    }
   ],
   "source": [
    "?rand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "33 methods for generic function <b>rand</b>:<ul><li> rand(::<b>Type{Float64}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L91\" target=\"_blank\">random.jl:91</a><li> rand() at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L92\" target=\"_blank\">random.jl:92</a><li> rand(::<b>Type{Float32}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L94\" target=\"_blank\">random.jl:94</a><li> rand(::<b>Type{Float16}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L95\" target=\"_blank\">random.jl:95</a><li> rand<i>{T<:Real}</i>(::<b>Type{Complex{T<:Real}}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L97\" target=\"_blank\">random.jl:97</a><li> rand(r::<b>MersenneTwister</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L100\" target=\"_blank\">random.jl:100</a><li> rand(::<b>Type{Uint8}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L107\" target=\"_blank\">random.jl:107</a><li> rand(::<b>Type{Uint16}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L108\" target=\"_blank\">random.jl:108</a><li> rand(::<b>Type{Uint32}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L109\" target=\"_blank\">random.jl:109</a><li> rand(::<b>Type{Uint64}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L110\" target=\"_blank\">random.jl:110</a><li> rand(::<b>Type{Uint128}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L111\" target=\"_blank\">random.jl:111</a><li> rand(::<b>Type{Int8}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L113\" target=\"_blank\">random.jl:113</a><li> rand(::<b>Type{Int16}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L114\" target=\"_blank\">random.jl:114</a><li> rand(::<b>Type{Int32}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L115\" target=\"_blank\">random.jl:115</a><li> rand(::<b>Type{Int64}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L116\" target=\"_blank\">random.jl:116</a><li> rand(::<b>Type{Int128}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L117\" target=\"_blank\">random.jl:117</a><li> rand(::<b>Type{Float64}</b>,dims::<b>(Int64...,)</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L121\" target=\"_blank\">random.jl:121</a><li> rand(::<b>Type{Float64}</b>,dims::<b>Int64...</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L122\" target=\"_blank\">random.jl:122</a><li> rand(dims::<b>(Int64...,)</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L124\" target=\"_blank\">random.jl:124</a><li> rand(dims::<b>Int64...</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L125\" target=\"_blank\">random.jl:125</a><li> rand(r::<b>AbstractRNG</b>,dims::<b>(Int64...,)</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L127\" target=\"_blank\">random.jl:127</a><li> rand(r::<b>AbstractRNG</b>,dims::<b>Int64...</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L128\" target=\"_blank\">random.jl:128</a><li> rand(::<b>Type{Bool}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L244\" target=\"_blank\">random.jl:244</a><li> rand<i>{T<:Number}</i>(::<b>Type{T<:Number}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L145\" target=\"_blank\">random.jl:145</a><li> rand(T::<b>Type{T<:Top}</b>,dims::<b>(Int64...,)</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L144\" target=\"_blank\">random.jl:144</a><li> rand<i>{T<:Number}</i>(::<b>Type{T<:Number}</b>,dims::<b>Int64...</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L146\" target=\"_blank\">random.jl:146</a><li> rand<i>{T<:Union(Int64,Uint64)}</i>(g::<b>RandIntGen{T<:Union(Int64,Uint64),Uint64}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L189\" target=\"_blank\">random.jl:189</a><li> rand<i>{T<:Integer,U<:Unsigned}</i>(g::<b>RandIntGen{T<:Integer,U<:Unsigned}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L205\" target=\"_blank\">random.jl:205</a><li> rand<i>{T<:Union(Unsigned,Signed,Bool,Char)}</i>(r::<b>UnitRange{T<:Union(Unsigned,Signed,Bool,Char)}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L212\" target=\"_blank\">random.jl:212</a><li> rand<i>{T}</i>(r::<b>Range{T}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L213\" target=\"_blank\">random.jl:213</a><li> rand<i>{T}</i>(r::<b>Range{T}</b>,dims::<b>(Int64...,)</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L232\" target=\"_blank\">random.jl:232</a><li> rand(r::<b>Range{T}</b>,dims::<b>Int64...</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L233\" target=\"_blank\">random.jl:233</a><li> rand(state::<b>DSFMT_state</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/random.jl#L739\" target=\"_blank\">random.jl:739</a></ul>"
      ],
      "text/plain": [
       "# 33 methods for generic function \"rand\":\n",
       "rand(::Type{Float64}) at random.jl:91\n",
       "rand() at random.jl:92\n",
       "rand(::Type{Float32}) at random.jl:94\n",
       "rand(::Type{Float16}) at random.jl:95\n",
       "rand{T<:Real}(::Type{Complex{T<:Real}}) at random.jl:97\n",
       "rand(r::MersenneTwister) at random.jl:100\n",
       "rand(::Type{Uint8}) at random.jl:107\n",
       "rand(::Type{Uint16}) at random.jl:108\n",
       "rand(::Type{Uint32}) at random.jl:109\n",
       "rand(::Type{Uint64}) at random.jl:110\n",
       "rand(::Type{Uint128}) at random.jl:111\n",
       "rand(::Type{Int8}) at random.jl:113\n",
       "rand(::Type{Int16}) at random.jl:114\n",
       "rand(::Type{Int32}) at random.jl:115\n",
       "rand(::Type{Int64}) at random.jl:116\n",
       "rand(::Type{Int128}) at random.jl:117\n",
       "rand(::Type{Float64},dims::(Int64...,)) at random.jl:121\n",
       "rand(::Type{Float64},dims::Int64...) at random.jl:122\n",
       "rand(dims::(Int64...,)) at random.jl:124\n",
       "rand(dims::Int64...) at random.jl:125\n",
       "rand(r::AbstractRNG,dims::(Int64...,)) at random.jl:127\n",
       "rand(r::AbstractRNG,dims::Int64...) at random.jl:128\n",
       "rand(::Type{Bool}) at random.jl:244\n",
       "rand{T<:Number}(::Type{T<:Number}) at random.jl:145\n",
       "rand(T::Type{T<:Top},dims::(Int64...,)) at random.jl:144\n",
       "rand{T<:Number}(::Type{T<:Number},dims::Int64...) at random.jl:146\n",
       "rand{T<:Union(Int64,Uint64)}(g::RandIntGen{T<:Union(Int64,Uint64),Uint64}) at random.jl:189\n",
       "rand{T<:Integer,U<:Unsigned}(g::RandIntGen{T<:Integer,U<:Unsigned}) at random.jl:205\n",
       "rand{T<:Union(Unsigned,Signed,Bool,Char)}(r::UnitRange{T<:Union(Unsigned,Signed,Bool,Char)}) at random.jl:212\n",
       "rand{T}(r::Range{T}) at random.jl:213\n",
       "rand{T}(r::Range{T},dims::(Int64...,)) at random.jl:232\n",
       "rand(r::Range{T},dims::Int64...) at random.jl:233\n",
       "rand(state::DSFMT_state) at random.jl:739"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(rand)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Int64,1}:\n",
       " 1\n",
       " 2"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = [1, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})\nwhile loading In[127], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})\nwhile loading In[127], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "v*v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})\nwhile loading In[128], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})\nwhile loading In[128], in expression starting on line 1",
      "",
      " in power_by_squaring at intfuncs.jl:56",
      " in ^ at intfuncs.jl:86"
     ]
    }
   ],
   "source": [
    "v^2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot(v, v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Int64,2}:\n",
       " 2  1\n",
       " 1  1"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = [2 1; 1 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`dot` has no method matching dot(::Array{Int64,2}, ::Array{Int64,1})\nwhile loading In[131], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`dot` has no method matching dot(::Array{Int64,2}, ::Array{Int64,1})\nwhile loading In[131], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "dot(M, v)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Matrix multiplication uses the `*` operator:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2-element Array{Int64,1}:\n",
       " 4\n",
       " 3"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M * v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "*<i>{T,S}</i>(A::<b>AbstractArray{T,2}</b>,x::<b>AbstractArray{S,1}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/matmul.jl#L71\" target=\"_blank\">linalg/matmul.jl:71</a>"
      ],
      "text/plain": [
       "*{T,S}(A::AbstractArray{T,2},x::AbstractArray{S,1}) at linalg/matmul.jl:71"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "@which M*v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "**Exercise**: Use the *power method* to calculate the largest eigenvalue $\\lambda_1$ of the matrix $M = \\begin{pmatrix} 2 & 1 \\\\ 1 & 1 \\end{pmatrix}$. In this method, we start from an arbitrary non-zero vector $\\mathbf{w}$, and repeatedly apply $M$ to it, thus calculating powers of the matrix $M$ applied to $\\mathbf{w}$. The resulting vector converges to the eigenvector $\\mathbf{v}_1$ corresponding to $\\lambda_1$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(\n",
       "2x2 Array{Float64,2}:\n",
       " 2.0  1.0\n",
       " 1.0  1.0,\n",
       "\n",
       "[1.0,1.0])"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w = [1., 1]\n",
    "M = reshape([2., 1, 1, 1], (2,2))\n",
    "\n",
    "M, w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0.381966,2.61803],\n",
       "2x2 Array{Float64,2}:\n",
       "  0.525731  -0.850651\n",
       " -0.850651  -0.525731)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eig(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.eig(A,[irange,][vl,][vu,][permute=true,][scale=true]) -> D, V\n",
      "\n",
      "   Computes eigenvalues and eigenvectors of \"A\". See \"eigfact()\"\n",
      "   for details on the \"balance\" keyword argument.\n",
      "\n",
      "      julia> eig([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])\n",
      "      ([1.0,3.0,18.0],\n",
      "      3x3 Array{Float64,2}:\n",
      "       1.0  0.0  0.0\n",
      "       0.0  1.0  0.0\n",
      "       0.0  0.0  1.0)\n",
      "\n",
      "   \"eig\" is a wrapper around \"eigfact()\", extracting all parts of\n",
      "   the factorization to a tuple; where possible, using \"eigfact()\"\n",
      "   is recommended.\n",
      "\n",
      "Base.eig(A, B) -> D, V\n",
      "\n",
      "   Computes generalized eigenvalues and vectors of \"A\" with respect\n",
      "   to \"B\".\n",
      "\n",
      "   \"eig\" is a wrapper around \"eigfact()\", extracting all parts of\n",
      "   the factorization to a tuple; where possible, using \"eigfact()\"\n",
      "   is recommended.\n"
     ]
    }
   ],
   "source": [
    "?eig"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n",
      "[3.0,2.0]\n"
     ]
    }
   ],
   "source": [
    "w0 = [1., 1]\n",
    "w = copy(w0)\n",
    "\n",
    "for i in 1:10\n",
    "    w_new = M*w\n",
    "    println(w_new)\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i =1:10\n",
    "    t = 3\n",
    "end\n",
    "t"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Linear algebra"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Julia has built-in linear algebra, not only using LAPACK, but now also generic routines that work for arbitrary element types, implemented completely in Julia.\n",
    "\n",
    "For example, given a matrix $A$, the LU-decomposition of $A$ is equivalent to Gaussian elimination; it expresses $A$ as the product $A = LU$, with $L$ a lower-triangular and $U$ an upper-triangular matrix.\n",
    "\n",
    "This is *implemented in pure Julia* for arbitrary element types. When the elements are standard floating-point numbers, it uses the corresponding fast LAPACK implementation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Complex{Float64}[50.0183+0.0im,1.84743+2.30961im,1.84743-2.30961im,-2.72534+0.880116im,-2.72534-0.880116im,-2.86948+0.0im,2.64375+0.964703im,2.64375-0.964703im,2.79553+0.0im,0.196765+2.72857im  …  -0.867929-0.457136im,0.478782+0.882849im,0.478782-0.882849im,-0.120951+0.762254im,-0.120951-0.762254im,-0.54004+0.0im,0.471338+0.0im,0.165157+0.118936im,0.165157-0.118936im,-0.288467+0.0im],\n",
       "100x100 Array{Complex{Float64},2}:\n",
       "  -0.101511+0.0im   -0.0115356-0.039612im    …   -0.0524037+0.0im\n",
       " -0.0952353+0.0im   0.00489796-0.00599155im      -0.0682674+0.0im\n",
       "  -0.108918+0.0im    0.0161753-0.092386im         -0.114214+0.0im\n",
       "  -0.111416+0.0im     0.102416+0.0351175im        -0.103224+0.0im\n",
       " -0.0977978+0.0im   -0.0198729+0.0722435im      -0.00218148+0.0im\n",
       " -0.0836507+0.0im     0.082544+0.0627261im   …    -0.036751+0.0im\n",
       " -0.0963353+0.0im   -0.0388372+0.0032277im        0.0954342+0.0im\n",
       " -0.0929018+0.0im     0.029581+0.0575031im        0.0794094+0.0im\n",
       "  -0.108383+0.0im   -0.0832873-0.160539im         0.0634216+0.0im\n",
       " -0.0902722+0.0im   -0.0375187+0.0593948im       -0.0071044+0.0im\n",
       "   -0.10374+0.0im    -0.102945+0.00231717im  …   -0.0538666+0.0im\n",
       "  -0.106464+0.0im    -0.104489-0.00207164im      -0.0406458+0.0im\n",
       " -0.0960566+0.0im    0.0159221-0.049508im          -0.16083+0.0im\n",
       "           ⋮                                 ⋱                   \n",
       " -0.0946263+0.0im   -0.0375218+0.0672119im          -0.1078+0.0im\n",
       " -0.0908183+0.0im  -0.00540686+0.142578im           0.12745+0.0im\n",
       "  -0.104126+0.0im   -0.0670472+0.0553909im   …    -0.158563+0.0im\n",
       " -0.0999715+0.0im    0.0382579-0.0947829im       -0.0696019+0.0im\n",
       " -0.0986926+0.0im    -0.084612-0.12682im           0.262889+0.0im\n",
       " -0.0949404+0.0im   -0.0400257+0.023941im          -0.11199+0.0im\n",
       "  -0.107486+0.0im   -0.0344824-0.0759473im         0.087478+0.0im\n",
       " -0.0944187+0.0im    -0.021001+0.0461968im   …    0.0110733+0.0im\n",
       " -0.0999898+0.0im    0.0392409-0.0264316im       0.00222877+0.0im\n",
       " -0.0991767+0.0im  -0.00947725+0.0518241im        0.0205667+0.0im\n",
       "  -0.108745+0.0im    0.0184766-0.0401366im         0.232166+0.0im\n",
       " -0.0993031+0.0im    0.0796098-0.0182621im        0.0712234+0.0im)"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = rand(100, 100)\n",
    "eig(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100x100 Array{BigFloat,2}:\n",
       " 2.225506282223690401878002376179210841655731201171875e-01  …  6.56851621473254265737296009319834411144256591796875e-01 \n",
       " 7.319635804294619685350653526256792247295379638671875e-01     9.672824011227445506477806702605448663234710693359375e-01\n",
       " 5.340947103998476830355457423138432204723358154296875e-01     9.836664954220417644847884730552323162555694580078125e-01\n",
       " 3.162661116152143403468244287068955600261688232421875e-01     6.32452881486862406035243111546151340007781982421875e-01 \n",
       " 2.223050262746237848432429018430411815643310546875e-01        9.4728250126541180264894137508235871791839599609375e-02  \n",
       " 9.375878604020722040246482720249332487583160400390625e-01  …  5.216604894602110409351780617726035416126251220703125e-01\n",
       " 2.82637383973149969307314677280373871326446533203125e-02      7.1043767348334707634194273850880563259124755859375e-01  \n",
       " 9.31414288307105042719058474176563322544097900390625e-01      6.843501947718078071147829177789390087127685546875e-01   \n",
       " 9.08755575606785992448521938058547675609588623046875e-01      7.7541670796339889903947550919838249683380126953125e-02  \n",
       " 9.90974279386318102069708402268588542938232421875e-01         3.446265247750661675496530733653344213962554931640625e-01\n",
       " 3.62011301348933667298979344195686280727386474609375e-01   …  5.674886600100188527306954711093567311763763427734375e-01\n",
       " 9.70427871977250333657138980925083160400390625e-01            1.845040577422647487537687993608415126800537109375e-01   \n",
       " 9.0041572068816577711913851089775562286376953125e-02          2.86408155710278666816748227574862539768218994140625e-01 \n",
       " ⋮                                                          ⋱                                                           \n",
       " 5.51151260187439984150614691316150128841400146484375e-01      3.306386894959143507577437048894353210926055908203125e-01\n",
       " 3.497623439347330442927841431810520589351654052734375e-01     8.4233377002282594503412838093936443328857421875e-01     \n",
       " 2.454565323093833573153688121237792074680328369140625e-01  …  3.436356112336635959536579321138560771942138671875e-01   \n",
       " 9.3207496351350638263966175145469605922698974609375e-01       7.007260372885506516382747577154077589511871337890625e-01\n",
       " 8.144309263423663569625432501197792589664459228515625e-01     3.333819991414610495183978855493478477001190185546875e-01\n",
       " 7.57929320416632634760389919392764568328857421875e-02         6.67666265761114541277265743701718747615814208984375e-01 \n",
       " 6.366199276186090827422958682291209697723388671875e-01        3.03926419592160268479119622497819364070892333984375e-01 \n",
       " 5.72819224497360668379997150623239576816558837890625e-01   …  6.6274981934506360659042911720462143421173095703125e-01  \n",
       " 9.56949160642551976962977278162725269794464111328125e-01      8.29108303980233163343882551998831331729888916015625e-01 \n",
       " 7.970001203346741558419807915925048291683197021484375e-01     1.888462575949938493380386717035435140132904052734375e-01\n",
       " 9.0568890895109799288320573396049439907073974609375e-01       4.966056054863334789928330792463384568691253662109375e-01\n",
       " 2.048115155536647247203063670895062386989593505859375e-01     3.74601565881409026559367703157477080821990966796875e-01 "
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = rand(100, 100)\n",
    "M2 = map(big, M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.map(f, c...) -> collection\n",
      "\n",
      "   Transform collection \"c\" by applying \"f\" to each element. For\n",
      "   multiple collection arguments, apply \"f\" elementwise.\n",
      "\n",
      "      julia> map((x) -> x * 2, [1, 2, 3])\n",
      "      3-element Array{Int64,1}:\n",
      "       2\n",
      "       4\n",
      "       6\n",
      "\n",
      "      julia> map(+, [1, 2, 3], [10, 20, 30])\n",
      "      3-element Array{Int64,1}:\n",
      "       11\n",
      "       22\n",
      "       33\n"
     ]
    }
   ],
   "source": [
    "?map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(\n",
       "100x100 Array{BigFloat,2}:\n",
       " 1e+00                                                                                 …  0e+00\n",
       " 1.838523316026038069423294824104585502107622762920382948468461321049017107287582e-01     0e+00\n",
       " 2.226652672640778428153578974542223057899272696712333628373710024305295178288089e-01     0e+00\n",
       " 8.800271373546953526824682655928247523713656239133309029931077636194740548240004e-01     0e+00\n",
       " 9.969711511643861050008990963774833601635694233722855443788571591033609498720476e-01     0e+00\n",
       " 8.979138730555442894457974595685742086077359813056139849438793026237408391767279e-01  …  0e+00\n",
       " 6.807588600102166833365124716208762430663471006732089118695641612340596096693672e-01     0e+00\n",
       " 2.455829705129951553304067727592573195211437393497849255275277512239547428646326e-01     0e+00\n",
       " 7.733884474442739333431587703752807939448278524827717594937087861232859025738641e-01     0e+00\n",
       " 6.369478597346308029171973720850203624729145464284684008762430813593740043172259e-01     0e+00\n",
       " 2.827829745702584616783062241061194670528384475163341040075224413128537647704774e-02  …  0e+00\n",
       " 6.8916911836155407719497226896317385232855759890401728866826844091322063237215e-02       0e+00\n",
       " 9.914847445449848621627477787268697917524046066273956341540063379389126840704449e-01     0e+00\n",
       " ⋮                                                                                     ⋱       \n",
       " 5.917560795509736662262312292818648981295636865290101585946113867783160165303854e-01     0e+00\n",
       " 2.730343465699633349451394482373398269247854760360330831523299677598397581623309e-01     0e+00\n",
       " 9.039945797670267226102309624603231261343146722095674272138480977753157246173324e-01  …  0e+00\n",
       " 9.462017626922501325170145941450688057814574666304378855494052732254706598746676e-01     0e+00\n",
       " 7.922089379792833548468864680973299515938762464750620693002149619341420960071084e-01     0e+00\n",
       " 8.91312804253419886178066534318762609663940375583837777475766448455788684217046e-01      0e+00\n",
       " 2.792642705237073137742461219913623698283706391737491380867611670762794730952418e-05     0e+00\n",
       " 7.573650294135219377704801284400430317640792346704970287945898791774355476300744e-01  …  0e+00\n",
       " 4.340348981096360281012666931631459479552193700232478278658625428081540612698508e-01     0e+00\n",
       " 8.425932003310413942243844696491498599262760249784090231673454808048725464374257e-01     0e+00\n",
       " 9.574420989713105503105950862187424587135981099834153833267817582826759295038591e-01     0e+00\n",
       " 9.937128828323402433568347457741518522388968395097111212977949553756464564214356e-01     1e+00,\n",
       "\n",
       "100x100 Array{BigFloat,2}:\n",
       " 9.994851507686071112601666754926554858684539794921875e-01  …   5.00779152589674314555168166407383978366851806640625e-02                            \n",
       " 0e+00                                                          5.957614820766671895663417312682526372739723842260882343182715867242722586063138e-01\n",
       " 0e+00                                                          4.469478342275836995433682687239315802830255734475567159873597681467845826134468e-01\n",
       " 0e+00                                                          1.594225612955579740227438886545435994704893579284040834538915577684978835022275e-01\n",
       " 0e+00                                                          3.51418102474667774543916344035850933636933755274101969213535739730486430086481e-01 \n",
       " 0e+00                                                      …   3.853995991912961375481683208700128985955666356716160345936599990779107394373079e-01\n",
       " 0e+00                                                         -1.388928850457794922700969846901469586577590670720174042695508511464725140648597e-01\n",
       " 0e+00                                                         -1.963736253744149588710187786364289757425844420781275911168560619527357939135026e-01\n",
       " 0e+00                                                          3.178968402329430072315582253427327119635802392272492696354540300940096734477185e-01\n",
       " 0e+00                                                          2.176214988150537681248929128626937855865936488765697272966015579849791295536862e-01\n",
       " 0e+00                                                      …   5.119997557073573321754864325074991553008298165056610101108332375190160965916915e-01\n",
       " 0e+00                                                         -8.199420519824984131304944439473283677509641603892215267311260421539949314147843e-02\n",
       " 0e+00                                                         -1.100757926861985762949819942253220494124734219500225416371630465493477225668268e+00\n",
       " ⋮                                                          ⋱                                                                                       \n",
       " 0e+00                                                          3.119374583443352091823412074951378032702116370133229255033911885197311498449721e-01\n",
       " 0e+00                                                         -3.963473902224899280333406215892276084125185726495321949218801950999434601486697e-01\n",
       " 0e+00                                                      …   1.460022051064841242988743472828596892824793640959853693084700574539034836575632e+00\n",
       " 0e+00                                                          9.460562261692564028602511319807472584567333376119182633775041922970959644819617e-01\n",
       " 0e+00                                                          1.916100769270754349291340364996423402303124329778281922547647681942010509253265e+00\n",
       " 0e+00                                                          2.453777141130431399782611832707715011759461721288957685494547893432872020437905e+00\n",
       " 0e+00                                                          3.092241770787052786375610695487741355942081214332538992688100491955019679622272e-01\n",
       " 0e+00                                                      …  -7.690085518435571170493252506836527889003361725238261885731324700815770035046439e-01\n",
       " 0e+00                                                          7.057077397497909132059254043595925169793816268455912227899415362222622859241975e-01\n",
       " 0e+00                                                          2.11408055146617577269295905987997866661481241577267775907335892526116912022093e-01 \n",
       " 0e+00                                                          4.72135706225358566629488251105981838448104777282753072505691201455089121862885e-01 \n",
       " 0e+00                                                         -1.411605504403213576549449087599331540683320578509496538094218931547453928045177e+00,\n",
       "\n",
       "[41,78,1,52,36,63,62,91,21,95  …  67,34,76,69,31,77,28,82,97,58])"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lu(M2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(\n",
       "100x100 Array{Float64,2}:\n",
       " 1.0         0.0         0.0         0.0        …   0.0       0.0       0.0\n",
       " 0.183852    1.0         0.0         0.0            0.0       0.0       0.0\n",
       " 0.222665    0.333612    1.0         0.0            0.0       0.0       0.0\n",
       " 0.880027    0.908157    0.485849    1.0            0.0       0.0       0.0\n",
       " 0.996971    0.0121974   0.880719    0.482328       0.0       0.0       0.0\n",
       " 0.897914    0.688716   -0.173968   -0.535249   …   0.0       0.0       0.0\n",
       " 0.680759    0.256184    0.805169    0.0615926      0.0       0.0       0.0\n",
       " 0.245583    0.122523    0.852098    0.230656       0.0       0.0       0.0\n",
       " 0.773388    0.783385    0.294589    0.813216       0.0       0.0       0.0\n",
       " 0.636948    0.621283   -0.464593    0.0427875      0.0       0.0       0.0\n",
       " 0.0282783   0.895956   -0.28519    -0.723122   …   0.0       0.0       0.0\n",
       " 0.0689169   0.529095    0.623271    0.567317       0.0       0.0       0.0\n",
       " 0.991485    0.723194   -0.0744293   0.0926657      0.0       0.0       0.0\n",
       " ⋮                                              ⋱                          \n",
       " 0.591756    0.553754    0.585172    0.792699       0.0       0.0       0.0\n",
       " 0.273034    0.946579    0.312432    0.252827       0.0       0.0       0.0\n",
       " 0.903995    0.190557    0.113748   -0.253964   …   0.0       0.0       0.0\n",
       " 0.946202    0.644426    0.227142    0.306999       0.0       0.0       0.0\n",
       " 0.792209    0.616671    0.267607    0.875396       0.0       0.0       0.0\n",
       " 0.891313    0.895161    0.31949     0.0199976      0.0       0.0       0.0\n",
       " 2.79264e-5  0.187737    0.926009    0.460432       0.0       0.0       0.0\n",
       " 0.757365    0.538407    0.300644    0.140578   …   0.0       0.0       0.0\n",
       " 0.434035    0.293604    0.46559     0.452693       0.0       0.0       0.0\n",
       " 0.842593    0.325906    0.090703    0.620878       1.0       0.0       0.0\n",
       " 0.957442    0.628242    0.0057032  -0.198115      -0.163927  1.0       0.0\n",
       " 0.993713    0.465608   -0.431142   -0.125049      -0.617413  0.640633  1.0,\n",
       "\n",
       "100x100 Array{Float64,2}:\n",
       " 0.999485  0.0617704  0.296413  …   0.536738     0.579976    0.0500779\n",
       " 0.0       0.964559   0.333478     -0.0592369   -0.0351511   0.595761 \n",
       " 0.0       0.0        0.756701      0.751446     0.616732    0.446948 \n",
       " 0.0       0.0        0.0          -0.572233    -0.401953    0.159423 \n",
       " 0.0       0.0        0.0          -0.097152    -0.229394    0.351418 \n",
       " 0.0       0.0        0.0       …   0.171652     0.103321    0.3854   \n",
       " 0.0       0.0        0.0          -0.823456    -0.31806    -0.138893 \n",
       " 0.0       0.0        0.0           0.346634     0.117767   -0.196374 \n",
       " 0.0       0.0        0.0           0.114205     0.694677    0.317897 \n",
       " 0.0       0.0        0.0           0.18621      0.454778    0.217621 \n",
       " 0.0       0.0        0.0       …   0.875338     1.06396     0.512    \n",
       " 0.0       0.0        0.0          -0.666298    -0.761167   -0.0819942\n",
       " 0.0       0.0        0.0          -0.463261    -0.622826   -1.10076  \n",
       " ⋮                              ⋱                                     \n",
       " 0.0       0.0        0.0           1.10803     -2.71365     0.311937 \n",
       " 0.0       0.0        0.0           1.55302     -4.63257    -0.396347 \n",
       " 0.0       0.0        0.0       …   0.00811131  -1.63731     1.46002  \n",
       " 0.0       0.0        0.0           0.959823    -1.79163     0.946056 \n",
       " 0.0       0.0        0.0           2.08064      0.0531956   1.9161   \n",
       " 0.0       0.0        0.0           0.803113    -1.73451     2.45378  \n",
       " 0.0       0.0        0.0          -1.11381      0.340109    0.309224 \n",
       " 0.0       0.0        0.0       …   1.40266      0.277447   -0.769009 \n",
       " 0.0       0.0        0.0          -1.36105      0.370272    0.705708 \n",
       " 0.0       0.0        0.0          -1.64671      0.297193    0.211408 \n",
       " 0.0       0.0        0.0           0.0          1.00489     0.472136 \n",
       " 0.0       0.0        0.0           0.0          0.0        -1.41161  ,\n",
       "\n",
       "[41,78,1,52,36,63,62,91,21,95  …  67,34,76,69,31,77,28,82,97,58])"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lu(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.lu(A) -> L, U, p\n",
      "\n",
      "   Compute the LU factorization of \"A\", such that \"A[p,:] = L*U\".\n"
     ]
    }
   ],
   "source": [
    "?lu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "2 methods for generic function <b>lu</b>:<ul><li> lu(x::<b>Number</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/lu.jl#L69\" target=\"_blank\">linalg/lu.jl:69</a><li> lu(A::<b>AbstractArray{T,2}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/lu.jl#L71\" target=\"_blank\">linalg/lu.jl:71</a></ul>"
      ],
      "text/plain": [
       "# 2 methods for generic function \"lu\":\n",
       "lu(x::Number) at linalg/lu.jl:69\n",
       "lu(A::AbstractArray{T,2}) at linalg/lu.jl:71"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(lu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# @edit lu(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.edit(file::String[, line])\n",
      "\n",
      "   Edit a file optionally providing a line number to edit at. Returns\n",
      "   to the julia prompt when you quit the editor.\n",
      "\n",
      "Base.edit(function[, types])\n",
      "\n",
      "   Edit the definition of a function, optionally specifying a tuple of\n",
      "   types to indicate which method to edit.\n"
     ]
    }
   ],
   "source": [
    "?edit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Interacting with the system"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Command-line arguments"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A Julia script, similar to a Python script, is a sequence of Julia commands placed in a file, with the termination `.jl`.\n",
    "\n",
    "From the command line, a script `script.jl` can be run as \n",
    "\n",
    "    julia script.jl arg1 arg2 \n",
    "\n",
    "where `arg1` and `arg2` are command-line arguments.\n",
    "\n",
    "These command-line arguments to Julia scripts are placed in the variable `ARGS` as an array of strings."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Files"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Simple file input and output is easy:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "IOStream(<file test.txt>)"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outfile = open(\"test.txt\", \"w\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "for i in 1:10\n",
    "    println(outfile, \"The value of i is $i\")\n",
    "end\n",
    "\n",
    "close(outfile)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The value of i is 1\n",
      "The value of i is 2\n",
      "The value of i is 3\n",
      "The value of i is 4\n",
      "The value of i is 5\n",
      "The value of i is 6\n",
      "The value of i is 7\n",
      "The value of i is 8\n",
      "The value of i is 9\n",
      "The value of i is 10\n"
     ]
    }
   ],
   "source": [
    ";cat test.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "IOStream(<file test.txt>)"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "infile = open(\"test.txt\", \"r\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10-element Array{Union(UTF8String,ASCIIString),1}:\n",
       " \"The value of i is 1\\n\" \n",
       " \"The value of i is 2\\n\" \n",
       " \"The value of i is 3\\n\" \n",
       " \"The value of i is 4\\n\" \n",
       " \"The value of i is 5\\n\" \n",
       " \"The value of i is 6\\n\" \n",
       " \"The value of i is 7\\n\" \n",
       " \"The value of i is 8\\n\" \n",
       " \"The value of i is 9\\n\" \n",
       " \"The value of i is 10\\n\""
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lines = readlines(infile)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10-element Array{Array{SubString{ASCIIString},1},1}:\n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"1\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"2\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"3\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"4\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"5\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"6\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"7\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"8\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"9\"] \n",
       " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"10\"]"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "map(split, lines)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10-element Array{Any,1}:\n",
       "  1.0\n",
       "  2.0\n",
       "  3.0\n",
       "  4.0\n",
       "  5.0\n",
       "  6.0\n",
       "  7.0\n",
       "  8.0\n",
       "  9.0\n",
       " 10.0"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[float(line[6]) for line in map(split, lines)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5x5 Array{Float64,2}:\n",
       " 0.494374  0.548784    0.265116  0.14175    0.225112 \n",
       " 0.610879  0.863226    0.90218   0.905241   0.0066329\n",
       " 0.352839  0.163394    0.514312  0.46365    0.750558 \n",
       " 0.72891   0.539688    0.37556   0.0172088  0.0674222\n",
       " 0.069424  0.00747654  0.951597  0.984837   0.350702 "
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = rand(5,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "writedlm(\"random.txt\", x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".49437356567549995\t.5487835147411582\t.2651160558475778\t.1417496876038895\t.22511205695160474\n",
      ".6108787919798604\t.863226095224578\t.9021796958394908\t.9052411849611\t.006632897854429665\n",
      ".3528390706690816\t.16339401668213926\t.5143118341066373\t.4636496583658838\t.7505578231005474\n",
      ".7289100209460473\t.5396877767037889\t.37555992341554356\t.017208754116336156\t.06742216219992869\n",
      ".069423968121745\t.007476542969398592\t.9515968215572792\t.9848367987309561\t.35070195619498623\n"
     ]
    }
   ],
   "source": [
    ";cat random.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5x5 Array{Float64,2}:\n",
       " 0.494374  0.548784    0.265116  0.14175    0.225112 \n",
       " 0.610879  0.863226    0.90218   0.905241   0.0066329\n",
       " 0.352839  0.163394    0.514312  0.46365    0.750558 \n",
       " 0.72891   0.539688    0.37556   0.0172088  0.0674222\n",
       " 0.069424  0.00747654  0.951597  0.984837   0.350702 "
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = readdlm(\"random.txt\")  # note that tab completion works for files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.writedlm(f, A, delim='t')\n",
      "\n",
      "   Write \"A\" (either an array type or an iterable collection of\n",
      "   iterable rows) as text to \"f\" (either a filename string or an\n",
      "   \"IO\" stream) using the given delimeter \"delim\" (which defaults\n",
      "   to tab, but can be any printable Julia object, typically a \"Char\"\n",
      "   or \"String\").\n",
      "\n",
      "   For example, two vectors \"x\" and \"y\" of the same length can be\n",
      "   written as two columns of tab-delimited text to \"f\" by either\n",
      "   \"writedlm(f, [x y])\" or by \"writedlm(f, zip(x, y))\".\n"
     ]
    }
   ],
   "source": [
    "?writedlm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.readdlm(source, delim::Char, T::Type, eol::Char; header=false, skipstart=0, skipblanks=true, use_mmap, ignore_invalid_chars=false, quotes=true, dims, comments=true, comment_char='#')\n",
      "\n",
      "   Read a matrix from the source where each line (separated by\n",
      "   \"eol\") gives one row, with elements separated by the given\n",
      "   delimeter. The source can be a text file, stream or byte array.\n",
      "   Memory mapped files can be used by passing the byte array\n",
      "   representation of the mapped segment as source.\n",
      "\n",
      "   If \"T\" is a numeric type, the result is an array of that type,\n",
      "   with any non-numeric elements as \"NaN\" for floating-point types,\n",
      "   or zero. Other useful values of \"T\" include \"ASCIIString\",\n",
      "   \"String\", and \"Any\".\n",
      "\n",
      "   If \"header\" is \"true\", the first row of data will be read as\n",
      "   header and the tuple \"(data_cells, header_cells)\" is returned\n",
      "   instead of only \"data_cells\".\n",
      "\n",
      "   Specifying \"skipstart\" will ignore the corresponding number of\n",
      "   initial lines from the input.\n",
      "\n",
      "   If \"skipblanks\" is \"true\", blank lines in the input will be\n",
      "   ignored.\n",
      "\n",
      "   If \"use_mmap\" is \"true\", the file specified by \"source\" is\n",
      "   memory mapped for potential speedups. Default is \"true\" except on\n",
      "   Windows. On Windows, you may want to specify \"true\" if the file\n",
      "   is large, and is only read once and not written to.\n",
      "\n",
      "   If \"ignore_invalid_chars\" is \"true\", bytes in \"source\" with\n",
      "   invalid character encoding will be ignored. Otherwise an error is\n",
      "   thrown indicating the offending character position.\n",
      "\n",
      "   If \"quotes\" is \"true\", column enclosed within double-quote (``)\n",
      "   characters are allowed to contain new lines and column delimiters.\n",
      "   Double-quote characters within a quoted field must be escaped with\n",
      "   another double-quote.\n",
      "\n",
      "   Specifying \"dims\" as a tuple of the expected rows and columns\n",
      "   (including header, if any) may speed up reading of large files.\n",
      "\n",
      "   If \"comments\" is \"true\", lines beginning with \"comment_char\"\n",
      "   and text following \"comment_char\" in any line are ignored.\n",
      "\n",
      "Base.readdlm(source, delim::Char, eol::Char; options...)\n",
      "\n",
      "   If all data is numeric, the result will be a numeric array. If some\n",
      "   elements cannot be parsed as numbers, a cell array of numbers and\n",
      "   strings is returned.\n",
      "\n",
      "Base.readdlm(source, delim::Char, T::Type; options...)\n",
      "\n",
      "   The end of line delimiter is taken as \"\\n\".\n",
      "\n",
      "Base.readdlm(source, delim::Char; options...)\n",
      "\n",
      "   The end of line delimiter is taken as \"\\n\". If all data is\n",
      "   numeric, the result will be a numeric array. If some elements\n",
      "   cannot be parsed as numbers, a cell array of numbers and strings is\n",
      "   returned.\n",
      "\n",
      "Base.readdlm(source, T::Type; options...)\n",
      "\n",
      "   The columns are assumed to be separated by one or more whitespaces.\n",
      "   The end of line delimiter is taken as \"\\n\".\n",
      "\n",
      "Base.readdlm(source; options...)\n",
      "\n",
      "   The columns are assumed to be separated by one or more whitespaces.\n",
      "   The end of line delimiter is taken as \"\\n\". If all data is\n",
      "   numeric, the result will be a numeric array. If some elements\n",
      "   cannot be parsed as numbers, a cell array of numbers and strings is\n",
      "   returned.\n"
     ]
    }
   ],
   "source": [
    "?readdlm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Shelling out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Example of defining a new type.ipynb\n",
      "fractal_example\n",
      "helllo_julia.png\n",
      "Index.ipynb\n",
      "Install IPython Notebook.md\n",
      "Install Julia.md\n",
      "Install Julia Packages.md\n",
      "Interoperability with Python and C.ipynb\n",
      "Introduction to Julia.ipynb\n",
      "intro.txt\n",
      "julia_tutorial.md\n",
      "Metaprogramming.ipynb\n",
      "Packages and graphics in Julia.ipynb\n",
      "Performance in Julia.ipynb\n",
      "Plan of the tutorial.ipynb\n",
      "random.txt\n",
      "README.md\n",
      "stuff.pdf\n",
      "test.txt\n",
      "Vector2d.jl\n",
      "What's next.ipynb\n",
      "Why Julia.ipynb\n",
      "Why Julia.slides.html\n"
     ]
    }
   ],
   "source": [
    ";ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello\n"
     ]
    }
   ],
   "source": [
    "run(`echo Hello`)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Scientific computing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Linear algebra, FFT, random numbers, special functions.\n",
    "Packages for optimization, ODEs etc."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Functions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Functions may be defined using the short syntax `f(x) = 3x + 1` or using a longer form:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dup (generic function with 1 method)"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dup(x) = 2x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "duplicate (generic function with 1 method)"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function duplicate(x)\n",
    "    2x   # no explicit \"return\" needed\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The last value computed in the function is automatically returned; no explicit `return` statement is required."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "duplicate (generic function with 1 method)"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duplicate(x) = x^2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Every operator in Julia is a function. Functions are implemented by specifying their action on different *types*. Until now, we have written only functions that are generic, in the sense that they do not specify which type they accept, and as in Python they will work as long as the operations performed in them make sense for the input value:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9,12.25,-8 + 6im)"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duplicate(3), duplicate(3.5), duplicate(1+3im)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"HolaHola\""
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duplicate(\"Hola\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`*` has no method matching *(::Int64, ::ASCIIString)\nwhile loading In[168], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`*` has no method matching *(::Int64, ::ASCIIString)\nwhile loading In[168], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "2 * \"Hola\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Note that string concatenation uses the `*` operator in Julia, instead of the `+` operator as in Python.\n",
    "Repeating a string is thus done by raising to an integer power:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"HelloHello\""
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Hello\"^2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a simple example, suppose that we wish to concatenate two strings. In Python we would write:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`+` has no method matching +(::ASCIIString, ::ASCIIString)\nwhile loading In[170], in expression starting on line 4",
     "output_type": "error",
     "traceback": [
      "`+` has no method matching +(::ASCIIString, ::ASCIIString)\nwhile loading In[170], in expression starting on line 4",
      ""
     ]
    }
   ],
   "source": [
    "s1 = \"Hello, \"\n",
    "s2 = \"David\"\n",
    "\n",
    "s1 + s2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "However, we see that in Julia, summation is not defined for strings. What is it defined for? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "+ (generic function with 148 methods)"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that `+` is treated as a function, and that it has a multitude of *methods*, which, in Julia, are specialised versions of the function that act on different types:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "If we were unaware of the `*` operator for string concatenation, we could just *define our own* `+` for the concatenation of two strings:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "+ (generic function with 149 methods)"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(s1::String, s2::String) = string(s1, s2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"First second\""
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"First\" + \" second\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "However, we cannot add a number to a string, since we have not (yet) defined it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`+` has no method matching +(::ASCIIString, ::Int64)\nwhile loading In[175], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`+` has no method matching +(::ASCIIString, ::Int64)\nwhile loading In[175], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "\"The value of x is \" + 3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "This we can also define, using the previous new definition:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "+ (generic function with 150 methods)"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(s::String, x::Number) = s + \"$(2x)\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"The value of x is 6\""
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"The value of x is \" + 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"The value of x is 7.0\""
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = 3.5\n",
    "\"The value of x is \" + x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`+` has no method matching +(::Int64, ::ASCIIString)\nwhile loading In[179], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`+` has no method matching +(::Int64, ::ASCIIString)\nwhile loading In[179], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "3 + \"hello\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "In fact, we can define the summation of a string with *any* other object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "+ (generic function with 151 methods)"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(s::String, x) = s + string(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Complex [3,4,5]\""
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Complex \" + [3,4,5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"a6\""
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"a\" + 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Number"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DataType"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(Number)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Signed"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Int64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Integer"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Signed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Real"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Integer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Number"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Real)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Any"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Number)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "In this way, the concept of \"function\" is replaced by a \"patchwork\" of different definitions for objects of different types, easily modifiable by the user.\n",
    "This is also exactly the way to define \"operator overloading\" for user-defined types."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the above, we also begin to see the power of *multiple dispatch*: we defined two methods (versions) of the function `+`, both with the same *number* but different *types* of arguments."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## User-defined types"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A user-defined \"composite type\" is a collection of data.\n",
    "Unlike in Python, types do not \"own\" methods (functions internal to the type).\n",
    "\n",
    "Rather, methods are defined separately, and are characterised by the types of *all* of their arguments; this is known as *multiple dispatch*. (*Dispatch* is the process of choosing which \"version\" of a given function to execute.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A simple, but useful, example, is that of defining a 2D vector type. (See also the `ImmutableArrays.jl` package; fixed-size arrays will later be incorporated into base Julia.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "//(n::<b>Integer</b>,d::<b>Integer</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/rational.jl#L15\" target=\"_blank\">rational.jl:15</a>"
      ],
      "text/plain": [
       "//(n::Integer,d::Integer) at rational.jl:15"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "@which 3//4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3//1"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rational(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3//2"
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "6//4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1 + 0im"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "im*im"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "immutable Vector2D   # type\n",
    "    x::Float64\n",
    "    y::Float64\n",
    "end "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector2D(5.0,6.0)"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = Vector2D(3, 4)\n",
    "w = Vector2D(5, 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`+` has no method matching +(::Vector2D, ::Vector2D)\nwhile loading In[196], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`+` has no method matching +(::Vector2D, ::Vector2D)\nwhile loading In[196], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "v + w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "+ (generic function with 152 methods)"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(v::Vector2D, w::Vector2D) = Vector2D(v.x+w.x, v.y+w.y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector2D(8.0,10.0)"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v + w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "* (generic function with 126 methods)"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "*(v::Vector2D, α::Number) = Vector2D(v.x*α, v.y*α)\n",
    "*(α::Number, v::Vector2D) = Vector2D(v.x*α, v.y*α)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector2D(10.5,14.0)"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v * 3.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector2D(10.5,14.0)"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3.5 * v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "**Exercise**: \n",
    "Define mathematical operations on `Vector2D`. Define a particle with position and velocity in 2D. Define function `move` that acts on a particle to move it over a time $\\delta t$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "immutable VectorT   # type\n",
    "    p::Vector2D\n",
    "    v::Vector2D\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "VectorT(Vector2D(0.0,0.0),Vector2D(2.0,3.0))"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = VectorT(Vector2D(0,0),Vector2D(2,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "move (generic function with 1 method)"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "move(a::VectorT, t::Number) = a.p+a.v*t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "new position of particle VectorT(Vector2D(0.0,0.0),Vector2D(2.0,3.0)) with origin position Vector2D(0.0,0.0) and velocity Vector2D(2.0,3.0) at time 3 is Vector2D(6.0,9.0)\n"
     ]
    }
   ],
   "source": [
    "println(\"new position of particle $a with origin position $(a.p) and velocity $(a.v) at time 3 is $(move(a, 3))\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, we have used `immutable` instead of `type` for efficiency: the object is stored in an efficient packed form."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The equivalent of the Python `__repr__` method for an object is to extend the `show` method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.show(x)\n",
      "\n",
      "   Write an informative text representation of a value to the current\n",
      "   output stream. New types should overload \"show(io, x)\" where the\n",
      "   first argument is a stream. The representation used by \"show\"\n",
      "   generally includes Julia-specific formatting and type information.\n"
     ]
    }
   ],
   "source": [
    "?show"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "show (generic function with 94 methods)"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import Base.show\n",
    "\n",
    "show(io::IO, v::Vector2D) = print(io, \"[$(v.x), $(v.y)]\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3.0, 4.0]"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "* (generic function with 126 methods)"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "+(v1::Vector2D, v2::Vector2D) = Vector2D(v1.x+v2.x, v1.y+v2.y)\n",
    "\n",
    "*(v::Vector2D, lamb::Number)  = Vector2D(lamb*v.x, lamb*v.y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can confirm that the new method for the function `+` has indeed been defined:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[8.0, 10.0]"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = Vector2D(3, 4)\n",
    "y = Vector2D(5, 6)\n",
    "\n",
    "x + y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Parametrised types"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Types may have a parameter, for example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "invalid redefinition of constant Vector2D\nwhile loading In[212], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "invalid redefinition of constant Vector2D\nwhile loading In[212], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "immutable Vector2D{T <: Real} #must same type T\n",
    "    x::T\n",
    "    y::T\n",
    "end "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "`T` is a type parameter.\n",
    "The expression `T <: Real` means that `T` must be a subtype of the abstract type `Real`.\n",
    "We can investigate the type hierarchy with the `super` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Integer"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Integer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Real"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Integer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Number"
      ]
     },
     "execution_count": 215,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Real)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Any"
      ]
     },
     "execution_count": 216,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(Number)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3.0, 4.0]"
      ]
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = Vector2D(3., 4.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3.0, 4.0]"
      ]
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = Vector2D(3, 4.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, the types of the two arguments were different, so there is no match for the type signature.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.75, 0.8333333333333334]"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = Vector2D(3//4, 5//6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "too many parameters for type Vector2D\nwhile loading In[220], in expression starting on line 2",
     "output_type": "error",
     "traceback": [
      "too many parameters for type Vector2D\nwhile loading In[220], in expression starting on line 2",
      ""
     ]
    }
   ],
   "source": [
    "import Base.show\n",
    "show{T}(io::IO, v::Vector2D{T}) = print(io, \"[$(v.x), $(v.y)]\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.75, 0.8333333333333334]"
      ]
     },
     "execution_count": 221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define *outer constructors*, defined outside the type definition itself, which allow other ways of constructing the object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector2D (constructor with 3 methods)"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Vector2D{T}(x::T) = Vector2D(x, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3.0, 3.0]"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Vector2D(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Example: a simple type for a collection of particles"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's define a particle:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "too many parameters for type Vector2D\nwhile loading In[224], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "too many parameters for type Vector2D\nwhile loading In[224], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "type Particle\n",
    "    position::Vector2D{Float64}\n",
    "    velocity::Vector2D{Float64}\n",
    "end\n",
    "move(p::Particle, dt::Real) = p.position += p.velocity * dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Particle not defined\nwhile loading In[225], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Particle not defined\nwhile loading In[225], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "show(io::IO, p::Particle) = print(io, \"pos: $(p.position); vel: $(p.velocity)\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Particle not defined\nwhile loading In[226], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Particle not defined\nwhile loading In[226], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "p = Particle(Vector2D(0.,0.), Vector2D(1.,1.))\n",
    "+{T}(v1::Vector2D{T}, v2::Vector2D{T}) = Vector2D{T}(v1.x+v2.x, v1.y+v2.y)\n",
    "\n",
    "*{T}(v::Vector2D{T}, lamb::Number)  = Vector2D{T}(lamb*v.x, lamb*v.y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "p not defined\nwhile loading In[227], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "p not defined\nwhile loading In[227], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "move(p, 0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "p not defined\nwhile loading In[228], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "p not defined\nwhile loading In[228], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "p"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Now we can define a gas as a collection of particle:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int64"
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Int"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Particle not defined\nwhile loading In[230], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Particle not defined\nwhile loading In[230], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "type Gas\n",
    "    particles::Vector{Particle}  # Array{Particle, 1}\n",
    "    \n",
    "    function Gas(N::Integer)\n",
    "        parts = [Particle(Vector2D(rand(2)...), Vector2D(rand(2)...)) for i in 1:N]\n",
    "        new(parts)\n",
    "    end\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Gas not defined\nwhile loading In[231], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Gas not defined\nwhile loading In[231], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "show(io::IO, g::Gas) = for i in 1:length(g.particles); \\\n",
    "    println(io, \"Particle $i: $(g.particles[i])\"); end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Gas not defined\nwhile loading In[232], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Gas not defined\nwhile loading In[232], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "g = Gas(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`move` has no method matching move(::Function, ::Int64)\nwhile loading In[233], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`move` has no method matching move(::Function, ::Int64)\nwhile loading In[233], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "move(g, 1)\n",
    "g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "Gas not defined\nwhile loading In[234], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "Gas not defined\nwhile loading In[234], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "function move(g::Gas, dt::Number)\n",
    "    for particle in g.particles\n",
    "        move(particle, dt)\n",
    "    end\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "`move` has no method matching move(::Function, ::Int64)\nwhile loading In[235], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "`move` has no method matching move(::Function, ::Int64)\nwhile loading In[235], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "move(g, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "g (generic function with 1 method)"
      ]
     },
     "execution_count": 236,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Matrix multplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Int64,2}:\n",
       " 1  1\n",
       " 0  1"
      ]
     },
     "execution_count": 237,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = [1 1; 0 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Int64,2}:\n",
       " 1  2\n",
       " 0  1"
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M * M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Int64,2}:\n",
       " 1  10\n",
       " 0   1"
      ]
     },
     "execution_count": 239,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M^10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Float64,2}:\n",
       " 1.0  -1.0\n",
       " 0.0   1.0"
      ]
     },
     "execution_count": 240,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M^(-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Array{Float64,2}:\n",
       " 1.0  -1.0\n",
       " 0.0   1.0"
      ]
     },
     "execution_count": 241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.inv(M)\n",
      "\n",
      "   Matrix inverse\n"
     ]
    }
   ],
   "source": [
    "?inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "det(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.618033988749895"
      ]
     },
     "execution_count": 244,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "norm(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.norm(A[, p])\n",
      "\n",
      "   Compute the \"p\"-norm of a vector or the operator norm of a matrix\n",
      "   \"A\", defaulting to the \"p=2\"-norm.\n",
      "\n",
      "   For vectors, \"p\" can assume any numeric value (even though not\n",
      "   all values produce a mathematically valid vector norm). In\n",
      "   particular, \"norm(A, Inf)\" returns the largest value in\n",
      "   \"abs(A)\", whereas \"norm(A, -Inf)\" returns the smallest.\n",
      "\n",
      "   For matrices, valid values of \"p\" are \"1\", \"2\", or \"Inf\".\n",
      "   (Note that for sparse matrices, \"p=2\" is currently not\n",
      "   implemented.) Use \"vecnorm()\" to compute the Frobenius norm.\n"
     ]
    }
   ],
   "source": [
    "?norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([1.0,1.0],\n",
       "2x2 Array{Float64,2}:\n",
       " 1.0  -1.0        \n",
       " 0.0   2.22045e-16)"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lamb, vv = eig(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2x2 Symmetric{Int64,Array{Int64,2}}:\n",
       " 1  1\n",
       " 1  1"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Symmetric(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DataType   : Symmetric{T,S<:AbstractArray{T,2}} (constructor with 2 methods)\n",
      "  supertype: AbstractArray{T,2}\n",
      "  fields   : (:data,:uplo)\n"
     ]
    }
   ],
   "source": [
    "?Symmetric"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "2 methods for generic function <b>Symmetric</b>:<ul><li> Symmetric(A::<b>AbstractArray{T,2}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/symmetric.jl#L6\" target=\"_blank\">linalg/symmetric.jl:6</a><li> Symmetric(A::<b>AbstractArray{T,2}</b>,uplo::<b>Symbol</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/symmetric.jl#L6\" target=\"_blank\">linalg/symmetric.jl:6</a></ul>"
      ],
      "text/plain": [
       "# 2 methods for generic function \"Symmetric\":\n",
       "Symmetric(A::AbstractArray{T,2}) at linalg/symmetric.jl:6\n",
       "Symmetric(A::AbstractArray{T,2},uplo::Symbol) at linalg/symmetric.jl:6"
      ]
     },
     "execution_count": 249,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "methods(Symmetric)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Eigenvalues of a random matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "**Exercise**: Generate a random matrix of $1000 \\times 1000$ gaussian random variates. \n",
    "Calculate its eigenvalues and plot them. Calculate the differences between consecutive eigenvalues and plot a histogram of them.\n",
    "\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "N = 1000\n",
    "M = randn(N, N)\n",
    "M = Symmetric(M);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Symmetric{Float64,Array{Float64,2}} (constructor with 1 method)"
      ]
     },
     "execution_count": 251,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "typeof(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "dot(x::<b>AbstractArray{T,1}</b>,y::<b>AbstractArray{T,1}</b>) at <a href=\"https://github.com/JuliaLang/julia/tree/687d2b0da6c5e8cff895e8c6f7f8e4b6866b7997/base/linalg/matmul.jl#L49\" target=\"_blank\">linalg/matmul.jl:49</a>"
      ],
      "text/plain": [
       "dot(x::AbstractArray{T,1},y::AbstractArray{T,1}) at linalg/matmul.jl:49"
      ]
     },
     "execution_count": 252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "@which dot([3], [4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Base.LinAlg.BLAS.dot(n, X, incx, Y, incy)\n",
      "\n",
      "   Dot product of two vectors consisting of \"n\" elements of array\n",
      "   \"X\" with stride \"incx\" and \"n\" elements of array \"Y\" with\n",
      "   stride \"incy\".\n"
     ]
    }
   ],
   "source": [
    "help(\"dot\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "elapsed time: 0.730055745 seconds (24964608 bytes allocated, 6.74% gc time)\n"
     ]
    }
   ],
   "source": [
    "@time lamb, vv = eig(M);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "using PyPlot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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rfO6dvbs2SZ5lgaH3E6dOjF79uwrevNBgwbx0UcfXfJ1h8MBQI8ePQgJCSEvL6/OPQcOHKBnz54EBQVd5ifdhAm4zwI9gI6Yj1YJdCAsLIc1a/77ip5dRERERK7M9OnTmT59ute13Nxchg4d2ujP4tOe3JSUFAC2bNnidX3z5s0ADB8+HICAgAAmTZrEhg0bKC4urrnv2LFjZGRkcPvtt3/PTzqO6cH9LdABcFRfL8PhyGbvXrUoiIiIiLQmPp2TO27cOCZOnMiiRYuoqqpi+PDh5OTksGjRIiZNmuR10tjChQtJSEhg4sSJzJ8/n7KyMhYsWEBMTAyPPPLI9/ykXwAHMRMVak9S+BE//3k/TVIQERERaWV8fuLZO++8Q2pqKitXrmTChAn88Y9/5OGHHyYtLc3rvt69e5OZmUlgYCB33HEHs2bNolevXjVjyC7vVTRJQURERETcHJZlWU39EFfL0+NxJ/A5nipuFQEBJfzjH39Vm4KIiIhIE3LntX379jFkyJBG+7k+r+Q2jseA/cAnwCtAKHfccasCroiIiEgr5dOe3MbzEOYgCDNNweH4Vm0KIiIiIq2YTSq5nmkKkEt8fDdVcUVERERaMZuEXD9MP+4w4C+EhYU28fOIiIiISFOySbvCi4C7kflDbryxX1M+jIiIiIg0MZuEXIAqYA+Bgf+XZct2NfXDiIiIiEgTsknITQXCgfakpIxVP66IiIhIK2eTkPtfwHf06PEkK1a83dQPIyIiIiJNzBYbz667LpWZMzewe/fbquKKiIiIiD0quWlpKxr1BA0RERERad5sUckVEREREalNIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGxHIVdEREREbEchV0RERERsRyFXRERERGzH5yE3JyeHKVOmEBsbS1hYGH379mXx4sWUlZXVuTc3N5dx48YRHh5OZGQkKSkpHDlyxNePKCIiIiI249OQe+DAAW6++Wa+/vprVqxYwebNm5k2bRqLFi1i+vTpXvcePHiQ0aNHU1lZyfr161m9ejWff/45iYmJnDp1ypePKS3IunXrmvoRpBFpvVsXrXfrovUWX/NpyH3rrbeoqKggLS2NO+64g9GjR/P000/zi1/8gvfee49z587V3LtgwQJCQkJIT09n/PjxTJ06lc2bN+NyuVi+fLkvH1NaEP1DsXXRercuWu/WRestvubTkBscHAxARESE1/WIiAj8/f0JCgoCoLKykvT0dFJSUmjbtm3NffHx8YwZM4aNGzf68jFFRERExGZ8GnJnzZpFhw4duP/++zly5AhFRUWkp6ezcuVK5s2bR0hICACHDx+mvLycgQMH1nmPAQMG8MUXX1BRUeHLRxURERERGwnw5Zt36dKFzMxMJk+e4JsUEwAADABJREFUTI8ePWquP/TQQ/z+97+v+f+nT58GICoqqs57REVFYVkWZ86coWPHjr58XBERERGxiQaH3MzMTMaOHduge/fv38/AgQM5dOgQ48aNo0ePHixbtowOHTqwZ88elixZQlFREatWrbrqB68tPz//mryPNH9nz54lNze3qR9DGonWu3XRercuWu/Wo6lyWoNDbp8+fRocSrt27QrAE088QVVVFR988EFNa8LNN99M+/btmT17Nvfeey8jR44kOjoagMLCwjrvVVhYiMPhIDIyss5rnTt3JjY2lrvvvruhH0NsYOjQoU39CNKItN6ti9a7ddF6tx6xsbF07ty5UX9mg0Nup06dmD179hW9+WeffUa/fv1qAq7bsGHDal4fOXIkPXr0ICQkhLy8vDrvceDAAXr27FmzSa22zp07k5OTwzfffHNFzyUiIiIijadz587NN+Reja5du5KXl0dJSQlhYWE113fv3g2Ynl2AgIAAJk2axIYNG1i2bFnNhIVjx46RkZHBI488csmf0RR/00RERESkeXNYlmX56s23bNnCpEmTGD58OL/+9a+Jjo5mz549LF26lG7duvHxxx8TEGBy9qFDh0hISGDIkCHMnz+fsrIyFixYwNmzZ9m/f39NS4OIiIiIyPfxacgFyMrK4rnnniMvL4+zZ88SHx/PpEmT+O1vf1unzzY3N5fHH3+c3bt3ExAQwC233MLy5cu57rrrfPmIIiIiImIzPg+5IiIiIiKNzaeHQfhKcXExqampxMXFERISwuDBg3n77beb+rGkgbZv386MGTPo1asXYWFhdOnSheTk5HpHyeTm5jJu3DjCw8OJjIwkJSWFI0eO1Pu+L730En369CE4OJjrr7+eRYsWUVlZ6euPI1dh1apV+Pn5ER4eXuc1rbk9ZGdnM2HCBKKioggNDaVXr14sWbLE6x6ttT3k5OQwZcoUYmNjCQsLo2/fvixevJiysjKv+7TeLUtxcTGPPfYYt956Kx06dMDPz4+FCxfWe68v1ragoICZM2fSoUMHwsLCuOmmm9ixY8eVfQirBfrZz35mRUZGWitXrrQyMzOtf//3f7ccDoe1du3apn40aYA777zTGj16tPWHP/zB2rlzp5WWlmb99Kc/tQIDA60dO3bU3Jefn2+Fh4dbo0aNsrZu3Wpt2LDBuuGGG6y4uDjL5XJ5veeSJUssPz8/68knn7R27txpPf/881abNm2sOXPmNPbHk+9x/PhxKyIiwoqLi7PCw8O9XtOa28P//u//Wv7+/ta//du/Wenp6VZmZqa1atUqa/HixTX3aK3tIS8vz2rTpo01ePBga/369VZGRob1zDPPWAEBAdaUKVNq7tN6tzxHjhyx2rVrZ40ePbomZy1cuLDOfb5Y2/LycuuGG26w4uPjrbVr11p/+ctfrOTkZCswMNDauXNngz9Diwu5mzdvthwOh/XWW295Xb/11lutuLg468KFC030ZNJQJ0+erHOtuLjY6tSpkzVu3Liaa3feeacVExNjFRUV1Vz76quvrKCgIOvxxx+vuXbq1CkrODjYmjt3rtd7Pvfcc5afn5/ldDp98Cnkak2cONFKTk62Zs6cabVt29brNa15y3f8+HErLCzMmjdv3mXv01rbwxNPPGE5HA7r8OHDXtfvu+8+y+FwWGfPnrUsS+vd0p06deqSIdcXa/vKK69YDofD2rNnT821yspKq3///tbw4cMb/Nwtrl1h48aNhIeHc+edd3pdnzVrFv/4xz/46KOPmujJpKFiYmLqXHP/J67jx48DUFlZSXp6OikpKTUj5QDi4+MZM2YMGzdurLn2/vvvc/78eWbNmuX1nrNmzcKyLN59910ffRK5Um+++SZZWVm88sorWBdtB9Ca28OqVasoLS3l8ccfv+Q9Wmv7CA4OBiAiIsLrekREBP7+/gQFBWm9beDif167+WptN27cSJ8+fRg+fHjNNX9/f+6++27+9re/Nfh8hBYXcj/99FP69u2Ln5/3ow8YMAAwB0xIy3Pu3Dlyc3Pp378/AIcPH6a8vJyBAwfWuXfAgAF88cUXVFRUAOZ3wn29tk6dOtG+fXv9TjQTJ0+eJDU1laVLlxIbG1vnda25PezatYvo6GicTieDBg0iMDCQjh07cv/991NUVARore1k1qxZdOjQgfvvv58jR45QVFREeno6K1euZN68eYSEhGi9bcxXa/vpp59e8j2h4VmvxYXc06dPExUVVee6+9rp06cb+5HkGpg3bx5lZWU8+eSTgGcdL7XWlmVx5syZmnvbtGlT52Q9gMjISP1ONBPz5s2jX79+zJ07t97Xteb2cOLECUpKSrjrrruYPn0627dv59FHH+WNN95gwoQJgNbaTrp06UJmZiYff/wxPXr0ICIigsmTJzNz5kxefPFFQOttZ75a28LCwmuS9Xx64plIQzz11FOsXbuWl19+mcGDBzf144gPpKWlkZ6ezieffNLUjyI+VlVVRXl5Oc888wyPPfYYACNHjiQoKIjU1FR27NhR85+4peU7dOgQ48aNo0ePHixbtowOHTqwZ88elixZQlFREatWrWrqR5RWrMVVcqOjo+tN8IWFhTWvS8uxcOFCnn32WZ577jl++ctf1lx3r6N7XWsrLCzE4XDUHCYSHR3N+fPnKS8vr/de/U40reLiYh544AEefPBBOnbsyNmzZzl79mzNf8I6d+4cJSUlWnObcP+9v+2227yujx8/HoCPP/6Y9u3bA1prO3jiiSeoqqrigw8+YOrUqdx888385je/4cUXX2T16tU17Sug9bYjX61tdHT0Jd+z9s/9Pi0u5A4cOJD8/Hyqqqq8rh84cACAG264oSkeS67CwoULa77mz5/v9VqPHj0ICQkhLy+vzvcdOHCAnj17EhQUBFDTt3Pxvd9++y2nT5/W70QTO3XqFAUFBSxfvpyoqKiar7feeouSkhIiIyO55557+NGPfqQ1t4FBgwZd9nWHw6E/3zby2Wef0a9fvzr/CXrYsGE1r+vPtn356s/ygAEDLvme0PCs1+JC7tSpUykuLiYtLc3r+uuvv05cXJzXTjxpvhYvXszChQt56qmneOqpp+q8HhAQwKRJk9iwYQPFxcU1148dO0ZGRga33357zbXx48cTHBzM66+/7vUer7/+Og6Hg+TkZJ99Dvl+nTt3JiMjg8zMzJqvjIwMbrvtNoKDg8nMzGTJkiX4+/trzW0gJSUFgC1btnhd37x5MwDDhw/XWttI165d+fTTTykpKfG6vnv3bsD07Gq97ctX/66eOnUqBw8e5G9/+1vNtcrKSt58801+8pOf0KlTp4Y9YIOHjTUjt956qxUVFWW9+uqr1o4dO3QYRAuzfPlyy+FwWElJSdaePXus3bt3e325HTx4sN4B0126dLFOnTrl9Z7PPvtszYDpzMxM6/nnn7eCg4Ot++67r7E/njTQjBkz6szJ1Zrbw6RJk6zg4GBryZIl1rZt26z/+I//sEJCQqzJkyfX3KO1tofNmzdbfn5+1k9/+lPrnXfesbZv3249++yzVnh4uHXDDTdY3333nWVZWu+WasuWLdb69eut1atXWw6Hw7rrrrus9evXW+vXr7dKS0sty/LN2p4/f97rMIht27ZZU6dOtYKCgqxdu3Y1+PlbZMgtLi62HnroIatz585WmzZtrEGDBllvv/12Uz+WNNDo0aMtPz8/y+Fw1Pny8/Pzunffvn3WuHHjrLCwMCsiIsK6/fbbrS+//LLe912xYoXVu3dvq02bNlb37t2thQsXWpWVlY3xkeQqzJw5s86JZ5alNbeDsrIya/78+VZ8fLwVGBhode/e3XryySetiooKr/u01vawa9cua/z48VZsbKwVGhpq9enTx3r00UetwsJCr/u03i1P9+7dvf79XPuvv/rqq5r7fLG2J0+etGbMmGFFR0dbISEh1k033WRt3779ip7fYVmXmPArIiIiItJCtbieXBERERGR76OQKyIiIiK2o5ArIiIiIrajkCsiIiIitqOQKyIiIiK2o5ArIiIiIrajkCsiIiIitqOQKyIiIiK2o5ArIiIiIrajkCsiIiIitqOQKyIiIiK2o5ArIiIiIrbz/wEnFMGWT2TE8gAAAABJRU5ErkJggg==",
      "text/plain": [
       "Figure(PyObject <matplotlib.figure.Figure object at 0x7ff90f976510>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1-element Array{Any,1}:\n",
       " PyObject <matplotlib.lines.Line2D object at 0x7ff8f8bd3390>"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(lamb, \"o-\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "Figure(PyObject <matplotlib.figure.Figure object at 0x7ff8f8bd3d50>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1-element Array{Any,1}:\n",
       " PyObject <matplotlib.lines.Line2D object at 0x7ff8f8a19310>"
      ]
     },
     "execution_count": 257,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PyPlot.figure(figsize=(8,4))\n",
    "plot(lamb, \"o-\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "differences = diff(lamb);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAIQCAYAAACWmjZmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3X98FNW9//F3SMIPEVFwtUKxYrggQVDU8qu3tdZqUQr3otVI1ZaIvVVbK20h3Ipfa1u0krT38m1rr/1abyiKkKrQYtFq0faKEknF34SWGn/gBXQDqICIJNn5/nEy7OzuzP5Isjszyev5ePAI2c3snp3dnXnv2c85p8iyLEsAAABAiPTyuwEAAABArgixAAAACB1CLAAAAEKHEAsAAIDQIcQCAAAgdAixAAAACB1CLAAAAEKHEAsAAIDQIcQCAAAgdHIKsfv371dVVZXOP/98RSIR9erVSz/4wQ+y3j4ajWr27NmKRCLq37+/pkyZoieeeCLnRgMAAKBnyynE7tq1S3fddZdaWlo0c+ZMSVJRUVFW23700Uc699xz9ec//1k/+9nPtGbNGh1//PGaOnWqnnzyydxbDgAAgB6rJJc/Pumkk/Tuu+9Kknbv3q1f//rXWW979913a/Pmzaqvr9fEiRMlSZ/97Gd12mmnqaqqSs8880wuTQEAAEAP1uGaWMuycvr71atX65RTTjkcYCWpuLhYV1xxhRoaGrRz586ONgUAAAA9TMEGdr3yyisaN25cyuVjx46VJG3evLlQTQEAAEDIFSzE7tmzR4MGDUq53L5s9+7dhWoKAAAAQi6nmlg/7Ny5k1IDAACAADvhhBN0wgknFPQ+CxZiBw8erD179qRcbl82ePDglOt27typs846Szt27Mh7+wAAANAxQ4YM0bPPPlvQIFuwEDt27Fi99NJLKZe//PLLkqRTTz015bqdO3dqx44duvfeezV69Oi8txH+mzt3rpYsWeJ3M1AgPN89C893z8Lz3XNs2bJFV1xxhXbu3Nk9Q+zMmTN13XXXqaGhQRMmTJAktba26t5779WkSZP0sY99zHPb0aNH64wzzihUU+Gjo48+mue6B+H57ll4vnsWnm/kW84h9pFHHtEHH3ygffv2STKzCjzwwAOSpGnTpqlfv36aM2eOli1bptdee03Dhg2TJF111VW64447dMkll+j2229XJBLRL3/5S/3jH//QunXruvAhAQAAoLvLOcRed911evPNNyWZ1bruv/9+3X///SoqKtLrr7+uE088UbFYTLFYLGEu2d69e+vxxx9XVVWVrr/+eh04cEDjx4/XI488ok9/+tNd94gAAADQ7eUcYl9//fWMf1NbW6va2tqUy4877jgtXbo017sEAAAAEhRsnlggG7NmzfK7CSggnu+ehee7Z+H5Rr4RYhEoHPR6Fp7vnoXnu2fh+Ua+EWIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKETihA7c+ZcjRkzTZWV89Xc3Ox3cwAAAOCzEr8bkI1t25ZIOl2NjQ1av75C9fV1ikQifjcLAAAAPglFT6zRS9IkNTXdqqqqar8bAwAAAB+FKMTaJqqhodHvRgAAAMBHIQyxvdTaWux3IwAAAOCjEIbYmEpK2vxuBAAAAHwUwhC7URMmlPvdCAAAAPgoFLMTGDFJG1VWtlDV1XV+NwYAAAA+CkWI7d9/rj7xiQGaMKFc1dVMrwUAANDThSLEfv7zS/S7353hdzMAAAAQECGsiQUAAEBPR4gFAABA6BBiAQAAEDqhCLFFRX63AAAAAEESihBrWX63AAAAAEESihALAAAAOIUixFJOAAAAAKdQhFgAAADAiRALAACA0CHEAgAAIHRCEWKpiQUAAIBTKEIsAAAA4ESIBQAAQOgQYgEAABA6hFgAAACETihCLAO7AAAA4BSKEAsAAAA4EWIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhE4oQmxRkd8tAAAAQJCEIsQCAAAAToRYAAAAhA4hFgAAAKETihBLTSwAAACcQhFiLcvvFgAAACBIQhFiAQAAAKdQhFjKCQAAAOAUihALAAAAOBFiAQAAEDqEWAAAAIROKEIsNbEAAABwCkWIBQAAAJwIsQAAAAgdQiwAAABChxALAACA0AlFiGVgFwAAAJxCEWIBAAAAJ0IsAAAAQocQCwAAgNAhxAIAACB0cgqx+/fv19y5czV06FD169dP48ePV11dXVbbrlu3Tueee66OO+44DRgwQKeddpp+/vOfKxaLdajhAAAA6LlyCrEXXXSRli1bpltuuUV//OMf9clPflKzZs3SihUr0m73xz/+Ueeff74k6e6779bvf/97ffazn9UNN9yg73znOx1vPQAAAHqkkmz/8OGHH9a6deu0YsUKVVRUSJLOPvtsvfnmm5o/f74qKirUq5d7Jr7nnnvUt29f/eEPf1C/fv0kSZ/73Of097//XUuXLtWSJUu64KEAAACgp8i6J3b16tUaMGCALrnkkoTLKysrtWPHDm3cuNFz2379+qm0tFR9+/ZNuHzgwIGHQy0AAACQraxD7CuvvKLRo0en9LaOHTtWkrR582bPbb/xjW8oFovpW9/6lnbu3Kn33ntPy5Yt0+9+9zstWLCgg00HAABAT5V1OcHu3bs1YsSIlMsHDRp0+Hov48eP1yOPPKIvfelLuuOOOyRJxcXFuv322zV37txc2wwAAIAeLusQ2xlPPfWUpk2bpnPOOUf/9m//pv79++vxxx/XwoUL9eGHH+qmm25Kuz3LzgIAAMAp6xA7ePBg197WPXv2HL7eyw033KDhw4dr9erVKmpPpGeffbZ69eqlW265RZdffrmGDx/uuf369XM1Y8bRCZfNmjVLs2bNyrb5AAAA6KQVK1akzEr13nvv+dKWrEPsuHHjtGLFCsVisYS62JdfflmSdOqpp3puu3nzZl1++eWHA6ztrLPOUiwW09/+9re0IfbTn16ilSvPyLapAAAAyAO3TsTnnntOZ555ZsHbkvXArpkzZ2r//v164IEHEi5funSphg4dqokTJ3puO2zYMP31r39NWdigvr5ekvTxj388lzYDAACgh8u6J3bq1Kk677zzdO2112rv3r0qKyvTihUr9Nhjj2n58uWHe1nnzJmjZcuW6bXXXtOwYcMkSd/97nd13XXXafr06fr617+ufv366fHHH9d//Md/6Lzzzjs8wwEAAACQjZwGdq1atUoLFy7UzTffrD179mj06NFauXKlLr300sN/E4vFFIvFZFnW4cuuueYaDRkyRD/96U/1ta99TQcOHNDw4cN1yy236Nvf/nbG+2VgFwAAAJyKLGfaDBi7xuKyyzZpxQpqYgEAAILGzmubNm3SGWcULq9lXRMLAAAABAUhFgAAAKFDiAUAAEDoEGIBAAAQOoRYAAAAhE4oQixTbAEAAMApFCEWAAAAcCLEAgAAIHQIsQAAAAgdQiwAAABCJxQhloFdAAAAcApFiAUAAACcCLEAAAAIHUIsAAAAQocQCwAAgNAhxAIAACB0CLEAAAAIHUIsAAAAQocQCwAAgNAhxAIAACB0CLEAAAAInVCEWJadBQAAgFMoQqxl+d0CAAAABEkoQiwAAADgFIoQSzkBAAAAnEIRYgEAAAAnQiwAAABChxALAACA0AlFiKUmFgAAAE6hCLEAAACAEyEWAAAAoUOIBQAAQOgQYgEAABA6oQixDOwCAACAUyhCLAAAAOBEiAUAAEDoEGIBAAAQOoRYAAAAhA4hFgAAAKFDiAUAAEDohCLEWpbfLQAAAECQhCLEAgAAAE6hCLH0xAIAAMCJEAsAAIDQCUWIBQAAAJwIsQAAAAgdQiwAAABCJxQhlppYAAAAOIUixAIAAABOoQix9MQCAADAKRQhFgAAAHAKRYilJxYAAABOhFgAAACETihCLAAAAOBEiAUAAEDoEGIBAAAQOqEIsdTEAgAAwCkUIRYAAABwKvG7AdmgJxYAAMAfzc3NqqqqVkNDo1pbi1VS0qYJE8pVXV2lSCTiW7sIsQAAAHAVjUY1Zcplamq6TVK1pCJJMTU2Nmj9+grV19f51jbKCQAAAOBqwYKa9gA7SSbASiY+TlJT062qqqr2rW2hCLH0xAIAABReQ0OjpIke105sv94foQixAAAAKLzW1mLFe2CT9Wq/3h+EWAAAALgqKWmT5PWVeKz9en8QYgEAAOBqwoRySRs9rt3Yfr0/QhFiqYkFAAAovOrqKpWV3SipXlKs/dKYpHqVlS1UdXWVb20jxAIAAMBVJBJRfX2dZs9eJWm6pBkqL5+u2bNXqb6+jnliAQAAEEyRSES1tTVaulQqKZE2b/a7RQY9sQAAAAidUIRYAAAA+C9IHYuhCLFB2mEAAADwXyhCLAAAAOAUihBLTywAAID/gpTJQhFiAQAAACdCLAAAAEInFCE2SF3XAAAAPVWQMlkoQiwAAADgFIoQG6TUDwAA0FMFKZOFIsQCAAAATqEIsUFK/QAAAPAfIRYAAAChE4oQCwAAADgRYgEAABA6OYXY/fv3a+7cuRo6dKj69eun8ePHq66uLuvtf//73+vss8/WwIEDdeSRR+rUU0/VXXfdlXOjAQAA0LOV5PLHF110kZ599lktXrxYI0eO1PLlyzVr1izFYjHNmjUr7ba33367brrpJl177bVauHChSktLtWXLFrW0tGS8X2piAQAA4JR1iH344Ye1bt06rVixQhUVFZKks88+W2+++abmz5+viooK9erl3rG7adMm3XTTTbr99ts1b968w5efc845nWw+AAAAeqKsywlWr16tAQMG6JJLLkm4vLKyUjt27NDGjRs9t/3FL36hvn376vrrr+9QI+mJBQAAgFPWIfaVV17R6NGjU3pbx44dK0navHmz57ZPPvmkRo8erfvvv1+jRo1SSUmJhg0bpu9973uUEwAAACBnWZcT7N69WyNGjEi5fNCgQYev97J9+3bt2rVLN9xwgxYtWqTy8nKtW7dOt99+u9566y3de++9HWg6AAAAeqqcBnZ1VCwW0759+7Ry5Updeumlkkw97QcffKAlS5boBz/4gcrKyjy3pycWAAAATlmH2MGDB7v2tu7Zs+fw9em2jUaj+sIXvpBw+dSpU7VkyRK98MILaUPs88/P1YwZRydcNmvWrIwzIgAAAKArrdCMGSsSLnnvvfd8aUnWIXbcuHFasWKFYrFYQl3syy+/LEk69dRTPbc97bTT9Nhjj3leX1RUlPa+x49fojVrzsi2qQAAAMiLWVqzJrET8bnnntOZZ55Z8JZkPbBr5syZ2r9/vx544IGEy5cuXaqhQ4dq4sSJntt+6UtfkmSm6XJau3atiouL9clPfjKXNgMAAMBHzc3NqqycrzFjpmnmzLm+tCHrntipU6fqvPPO07XXXqu9e/eqrKxMK1as0GOPPably5cf7k2dM2eOli1bptdee03Dhg2TJM2ePVt33nmnrrvuOu3atUujR4/WunXr9Mtf/lLXXnvt4b/zQk0sAABAMESjUU2Zcpmamm6TVC3peUmF74nNaWDXqlWrtHDhQt18883as2ePRo8enTBYSzKDuGKxmCxH8iwpKdGf/vQn3Xjjjbrtttu0Z88enXzyyVq8eLG+853vZLxfQiwAAEAwLFhQ0x5gJ/najiLLCm5EtGsszj13k9atoyYWAADAL/YQpvLyaWps/IMke0zTc5LO1KZNm3TGGYXLa1nXxPopuDEbAACgZ2ltLVY8wPonFCEWAAAAwVBS0ibJ/x7GUIRYemIBAACCYcKEckkb/W5GOEIsAAAAgqG6ukplZTdKqpcU860dhFgAAABkLRKJqL6+TrNnr1JR0XQdfbQ/88SGIsRSTgAAAOCf5CwWiURUW1ujPn3W6uqrl/jSplCEWAAAAPgnXYdikU8TFYQixNITCwAAEDx+ZrRQhFgAAAD4xyusWhY9sWnREwsAABBMhFgAAAAEUrqeWL+EIsTSEwsAAOAfQiwAAAC6FcoJAAAAEEj0xHYQ5QQAAAD+YXYCAAAAdBuE2AzoiQUAAPAPK3YBAAAgdKiJ7SB6YgEAAOAUihALAAAA/1BO0EH0xAIAAASL3/ksFCEWAAAA/nELrPZl9MQCAAAgkAixHeR3dzUAAADcEWIBAAAQSOl6Yv0SihDr904CAADoyQixAAAA6FYoJ0jD76QPAADQk9ET20F+7yQAAICejNkJAAAA0K0QYgEAABBIlBMAAACgW/C7nKDEn7vNzaFD76qycr4aGhrV2lqskpI2TZhQrurqKkUiEb+bBwAA0K0FsSc2FCF2y5Z/14sv/lxStaQiSTE1NjZo/foK1dfXEWQBAADyKF1gpSY2jUOHrpM0SSbASqbZk9TUdKuqqqr9axgAAEAP5XdPbChCrDTO4/KJamhoLGhLAAAAepogTrEVinKCeA9ssl46eLCVelkAAIA8CmI5QUhCrNeee1tvvbVNS5f+QNTLAgAAFA7lBFl5xePyBWppuVvUywIAAORPEMsJQhJifyGpXlKs/feYpKdVWvqspMke21AvCwAA0BWYYqvDbpe0StIiScWS9mnECEuWdZKamrzrZVtbiwvWQgAAgJ6Inti0BkqqkfSQpAU66aSYNmy4X336SN71sjGVlLQVqoEAAADdFj2xHTZX0iBJrZIikkw4nTChXI2NG2VqYpNt1IQJ5QVrIQAAQHcVxJrYkITYn0k64/Bvb7xRr6qqalVXV2n9+go1Nd0qaaJMx3JM0kaVlS1UdXWdP80FAADoISgnyIkZtBWJRFRfX6fZs1dJmi5phsrLp2v27FVMrwUAANBFKCfoMvFBW5FIRLW1NVq61FyzebN/rQIAAOgp/C4nCGlPLIO2AAAACiWIPbEhDbEM2gIAACgUlp3tMOciB8+orOwmBm0BAAD4yO+e2JCEWHuKrX3q3dtSff39DNoCAAAoEKbY6jB7iq2YevWaToAFAAAooCCWE4SsJraXLIulZAEAAPzmdzlByEJsTEVFzEoAAABQSEEsJwhZiN2o/v2ZlQAAAKCQ/O51dROSmtiYpHpJCzV0KLMSAAAA+M3vYBuSEDtX0mRJdSotZVAXAABAIQWxnCAkIdaenQAAAABB4HeIDVlNLAAAAAqNKbYAAAAQOunKCfxCiAUAAEDOKCcAAABAoPnd6+omdCHWr7QPAADQU1FOAAAAgG6BcgIAAAAEWhDniSXEAgAAIK0gTrEVksUO4qiJBQAA8E9zc7Oqqqr11FONkor1wx/u8aUdoQuxAAAAKKx4T2xUkydfpqam2yRVSyrS228/K+mTBW8TIRYAAABpxUNsTXuAneS41p/qVGpiAQAAkKVGSRP9boQkQiwAAAAyiPfEFksKxgClbhdi/Z54FwAAoPtqkxSMsBW6EJtpdoJYrDDtAAAA6CninYTlkjb62JK40IXYTOiJBQAA6FrxfFWlsrIbJdVLsnsO/elBJMQCAAAgSxHV19dp4sRVkqZLmqGPfWyuLy0hxAIAACAtZ76KRCL68pdrJK2VtEY/+tHPfGlTtwux1MQCAAB0reROwtZWf9rh1O1CLD2xAAAA+dXWFv9/pkH3+UKIBQAAQFrJ+YoQmweUEwAAAHStdCHWL90uxNITCwAAkF/0xHZAph1FiAUAAOha6QZ2EWK7COUEAAAA+UVPbB7QEwsAANC1kvNVEDoNcwqx+/fv19y5czV06FD169dP48ePV11dXc53etNNN6lXr14aO3Zsjls2q6lpvsaMmaZRo2ZozJhpqqycr+bm5sN/QYgFAADoWkEc2FWSyx9fdNFFevbZZ7V48WKNHDlSy5cv16xZsxSLxTRr1qysbuOFF17QT3/6Ux1//PEqyqn/OSrpMu3adZt27aqWtEvSYjU2btLy5edLOk7SOEWjVRo0KJLLwwIAAEAOglBOkHWIffjhh7Vu3TqtWLFCFRUVkqSzzz5bb775pubPn6+Kigr16pW+Y7e1tVWVlZW65ppr9MILL2j37t05NLVG0m2SJskOtOb3GrW0FEmKSWrQBRdUqKGhTpEIQRYAAKArhHrFrtWrV2vAgAG65JJLEi6vrKzUjh07tHHjxoy3cfvtt+u9997TokWLZOX8vX+jpInt/3cGWjv+95I0SW+8cauqqqpzvG0AAAB4CeJiB1n3xL7yyisaPXp0Sm+rXde6efNmTZ482XP7xsZG3XrrrVq9erX69+/fgaYWKx5YGyV5BdWJamhY1IHbBwAAQHNzs6qqqtXQ0KjW1mKVlLTp5JPLJVVJMt90hyrE7t69WyNGjEi5fNCgQYev99LW1qarrrpKF198saZOndqBZkpSmyRLJsg6A22yXmptLe7gfQAAAPRc0WhUU6Zcpqam22Q6DE3JZmNjg6QKSXWSIoEY2FWQKbb+8z//U01NTVqyZEknbqVckl2yYAdaNzGVlARgzwIAAITMggU17QE2tWRTulX2N+Gh6okdPHiwa2/rnj17Dl/vZtu2bbr55ptVXV2tkpISvffee5LMIK+2tja9//776tOnj/r27Zvm3udKOkJSraTRknZI+pGkm13+dqMmTCjP9mEBAACgXUND+pJN6TrNmDFDzz8fv/SnP32vAC1LlXVP7Lhx47RlyxbFkma3ffnllyVJp556qut2r732mg4ePKhvfetbGjRo0OF/GzZs0JYtW3TMMcfoxhtvzHDvSyT9UdIWRSKTJA2XtELS0zKzEqj9Z70+8YmFqq6uyvZhAQAAoJ0pyfQu2ZSGac2aNTr77DWSzL958zrzTXvHZd0TO3PmTN1111164IEHdOmllx6+fOnSpRo6dKgmTpzout348eP1l7/8JeEyy7I0d+5c7d27V7W1tRo6dGiWrYhoxIgambUNmnX55dVavvw2HXFEsQ4caJNUrtWrmV4LAACgI0xJpj0GKVlMpqQzZIsdTJ06Veedd56uvfZa7d27V2VlZVqxYoUee+wxLV++/PDCBXPmzNGyZcv02muvadiwYRo4cKA+85nPpNzewIED1dra6npddiK6884aLV8uTZkirVtnLm0fZwYAAIAcTZhQrsbGjTI1sMk2yoxRCkZNbE4Du1atWqUrr7xSN998sy644AL99a9/1cqVKxNW64rFYorFYhnngS0qKspxxa5UdmVDUVF8BwZhLV8AAIAwqq6uUlnZjZLqlVyyKS2UmWYrGCE2p2Vn+/fvryVLlqSdZaC2tla1tbUZb+vPf/5zLnftyi0n57yGAgAAQA/jNhfshAnlqq6uUn19naqqqrVq1SIdPFisESPadNJJ5Xr4YTO9lmUFY8WunEJs0DgDa1GR+Z0QCwAA4C3dXLDr11eovr5OtbU1+vBD6ZVXzL+nn5Yefthsb1nB6IktyDyx+ZIcYqXUcoLm5mZVVs7XmDHTNGrUDI0ZM02VlfPVbEaHAQAA9Cjp5oJtarpVVVVmiq1YLB5WnZkrOcT6pdv0xLpdls0nDWYyAAAAXSndV/VByB2Z5oJtaFgkyTusBqUnNnQh1rmjMoXYxE8atsRPGrW1NXlqKQAA6GnC0IGWaS5Yc33we2K7TTmB22Xmk4b7/LXmk0ZjPpoFAAB6qGy/qvdTfC5YN7H2602msss0k0Osc2AXNbEdkGmKrWw/aQAAAHSFMHSgTZhQLjPnq5uN7dcn9sQ6BaWcINQhNlNPbLafNAAAALpCGDrQ0s0FW1a2UNXVZi5YZ1ilnKCLuc1O4Lws208aAAAAXSEMHWiRSET19XWaPXuVSkqmS5qh8vLpmj17VULNrntNbLO+9rX5euGFaZJmSJqmO+7wXj8gn0I3sMsp0xRb1dVVWr++Qk1Nt8p07feS+aSxsf2TRl3hGgsAALq9TMu2BqUDLRKJqLa2Rk88IW3bJm3enPo3qT2uUUmX6d57Ewet/eUv90i6pwCtThS6nthcZiewP2lcfPEqSdN1wgnunzQyYa5ZAACQjWy/qg+KdPWsqT2xNZLcBq2NzWMLvXWbnlivyyKRiH784xo9+KD0k59IX/5ybvcRhqkyAABAMNgdaPPnV+s3v1mk3r3Nsq1mnthwZYbUnth088sWXrcJsV4rdjkv60gRMnPNAgCAXEQiEf33f9foN7+Rysul55/3u0Udk9oTm27QWuF163ICW2dCbBimygAAAMHilkeCyG1gvC11doJ0g9YKL9Q9sW7zxKYLsW69tJmEYaoMAAAQLB3JHPnmthxuc3O5pCpZViSlPjZ1nlh71ie3QWuFF+oQW4hygvhUGW5BNhhTZQAAgGAJWk+s1xgfqUFShd55p04nnJBYr5taTlAlqUJS8qxPLxXmQSQJSTnBXEnTJM1XS0t8RgC3wJquxKAjIZa5ZgEAQK6CFmLTLYcr3aoFC1IHbNnLzlqW/Xgikuo0a9YqFReb+WWl6frc554oyGNIFpIQu0TSQ5Iu1osvVkgyQTbbENuZntiwTZUBAAD8F7QQm2mMz7PPpo7xcS/HjOgXv6jR0UevlbRG0lp961tzu7St2QpJiJXsTwsHD94qe3oHr/V8kzlDbK5zvjpXtZC8V7UAAACwBS3EdmSMj/0Y7N5Y5+WtrfHf0801m08hrImdKGmRpMRPBtnUxL7/flSTJ+c+56u9qsXSpeZ3t1UtAAAAbEEb2JVpjE9xcWrPoLMTMIghNkQ9sbZeMvOU5d4Tu2aNdz2IPecrAABAZwWtJzbTGJ8zz0wd4+M1psiypJaW+O+E2KzFZOYpi+/UTFNs2Zdt28acrwAAIP+CFmLTjfGRFupHP0od45OuJ9YZYv0SwhC7UWaestzLCWIx5nwFAAD5F7QQ6zXGZ8CAVZLqNHhwajmlV09scqilJjajmKSN6tt3oQ4erDOXtIfT5E8HKVseXhSBOV8BAED+BS3ESu5jfEaNkvbtS98J+M7Hp46zAAAgAElEQVQ7zfrxj2+R9LSkNn3iE6Uy/aCTJd1cgJa7C0VP7IknzpX51LBKp51WJzNPWe5TbA0dypyvAAAg/4I2sCsT73LMqM4/f6aefPJ5SXdKekktLc/JLJIwS9KX9P777xawpXGhCLGrVy+RtFZSjXr3jnd3O7u3syknOPdc5nwFAAD5Z4dCv75qz1a6MUUmP9XorbfKJP2HUgfGT5F0m2prf5P/hroIRYj1kmtPbN++zPkKAADyz84jQSwrcOOdqRol7ZL3wPjJ+vvfX8tbu9IJUU1sKree2HSzE8RizPkKfzQ3N6uqqloNDY1qbS1WSUmbJkwoV3V1FR+eAKAbCkt4zdwTaw969x4YH4v50yca6hAbH7CVXTlBR5adBTorGo1qypTcF9kAAIRXWEKszTs/2eHJe2B8r17+FACHupygI8vOAoW2YAGLbABAT+M1sKu5uVmVlfM1Zsw0jRo1Q2PGTFNl5Xw1NzcXtoHt0vXEtrQ0S/pA0rHyHhhfr1NOOTk/jcsgdCHWWSCda00sIRZ+MItosMgGAPQkbgO7otGoJk+u0NKlF6ux8Q/aunWNGhsf0tKlF2vy5ArfgqyUmqmi0aiamiokLZDUJOk7kjYocWD805Ju1NVXf7VwDXUgxAJ5ZhbRYJENAOhJ3PJIkL+ZS27vggU1amm5TdIFklZLGi/pOkmntf9/rKSVkh7QwIHHFLSttlDXxLoN7Hr33WZVViYOoDnhhHJJVYrFqDtE4ZlFNFhkAwB6ErfZCcw3b15BdaIaGhblu1kpvMYUJbY1IukOx7UxmVmeft5+G2/ltY1eQh1i7R1+6FCzPvigWtLz+upXt6utrVbJA2ikCu3fH18oASiUCRPK1di4UeaTdzIW2QCA7sitJzbI38wltzdTW+OzFvg3F27oygmcTIiN6plnKtTScrGk09sDbGo3vXSrNmxgAA0Kr7qaRTYAoKdxK3mMfzPnuoUv38x59cRmamt81gL/hDrEmnKCGh04YNeXbFG6ATTNzQygQeFFIiyyAQA9jdvALvPNm9cof3+/mUvuic3UVineVnpiO8CEWOfI7/Rd37EYA2jgD3uRDbN88hpt3rxWtbU1BFgA6KbcygmC+M2cV09sdXWVSkrc2yotlBRvKyG2A+IrSdh7L33Xd1GR/13fAACg+3MLsUH+Zi65vZFIRCecUCcp3lZpukaMWCUpGGOMusHALufIb7vr230AzaBBDKABAAD55zY7gRT/Zm7pUvP75s0FbVaKdCueFhVFJNUkXPbZz0qvvpr3ZmWlG4RYZ3CtklQh6VaZEoNeMl3fGyUt1Lhxdf40FAAA9CheK3YFlVvPceplzXryyWqZUs5imY7Ecr3//tR8N89VqEOsqYmt0hFHVOjAATu41klaLOlGSe/p+OOP06hR4/Tkk3UqLfW/6xtdo7m5WVVVifMBT5hQrurqKupMAQC+cxvY5Zfkc6YdPqPRqvbe1nSLRTXLTFv6vKTt2ro1cRpTqUHf/Ob1hXgYKUIXYp072ezciCZNqtPTT1fro48WSSpWWVmbjj/+LG3YUKUf/CCi/v2lJ58M36eisCh0oIxGo5oy5bL2VU8S5wNev77C97qinooPFgAQ5xYK/eB1zpQaNGVKhfr0MfWtbhmppSUq6TJJt8mUbi5SYsmmmcZ0585vSKrM6+NwE+oQa6/Y1adPREcdVSN7yeGHHpKeeUbasMH8PcvO5o8fgTJx2T5b4rJ9ZiYAFAofLAAgUVBCbKZz5jHHVEuqcW3v3r01MgF2kqQfyXsa01O7tM3ZCt3sBG4hNrmrvq1N6tUr/veE2Pzp7DrQzc3NqqycrzFjpmnUqBkaM2aaKivnq9n+ROLCLIXnPR+wuR6FFOT1wNE1OvJeBXqyoITYTOfMAwfMOdO9Jzb7aUz9EOqeWK/ygNbWeIiNxeLbEGK7XmfWge5o712Ql+3rqYK4Hji6Dj3tQO7sjOJ3mM10zrQsc850b6fbNKZut+VPvWaoe2KdIdbZG9vWljhlhP133aEmNmi9IZ0JlB3tvQvisn09HR8sujd62oHc+RlenVnhjTdeVzZz6LtlJMtynm/TreD1Sqfa21HdsifWGWK7UzlBEHtD4oHS/ZNZukDp3XvXLOlB3Xffo9qw4e8pA4QmTChXY6P3fMB+LtvXU3XmdYDgo6cdyF2hZidInXnggHbubNa+fb+Sed9WSXpG0mSXrTeqf/9yffSRe+guKSnXoUOZpzEdMuQO7diRj0eXXqh7Yr1CaWtrcENsZ3pSg9gb0pl1oN1776Iyb5Iv6dChl7R16xo1Nj6kpUsv1uTJFWpubg7ksn09XZDXA0fn0dMO5K4QPbHRaFSTJ1do6dKL1dj4B23dukZbt56uffvuVDwrVMksE5t6zhw+fKGGDDHnTLeOwb59q2SmLK2XNFhmGtMHJZ0rabykCySt0p133p6/B5lGqENsunKCIA7scnuxJQe0dII4oKkzgdK9LMA5EtI9qAd52b6eig8W3RslPEDuOhJic+3ocu/c2qLEbyojMuFzlaQvSjpD5ty5Sn/6U5169/aeJ9bMIetcenaOjjtui6SzdMIJj0l6VFKNjj76mNwfbBcIXTmBkzOUpquJtZ8Yv2tiOzs1VBB7Q+xAWVVVraVLzTy95eX21//pA6V7WUB2X1sGbdm+nq4zrwMEHyU8QO5yzRwdKRlMLPWxFyXYqdSs4Fw+doakNZKkQYPif7F7d7MqKxPLEvbubZXUp/2fJI3S179epR/9KKI+feLb+rWgQ+hCrFtPrNsUW0EsJ+hsXVlQ6w47Giirq6u0fn2Fmpqc9TXBC+rIDh8sui/396qphTM97SzpjfwI8yIqufbEend0lampaZj+6Z8u0PHHD0nYB/HOLeeiBI1KP4tAPCtYlp2Xopoz5zJt324H6Ob227td5j0fXyDhl7+skFSnkpL4/vcrxIa6nCBsNbGd7UntbnWHzrKAo44yZQG9e6cfRcnXlkDhJZfwlJZSwoP862wJnt9yDbHuJYP2OJFr9f77f03ZB9JHMudMZyle+qxgrjfivcU17QHWLkvwLu3bvftWSdUqCUA3aOhCrDOIOrvqvcJtkEJsal1Zs6T5kqZJmqE33ng9be1Ld6w7tHvvLrhgraQ1mjFjqrpTUAe6C/u9Kq3V8OFrtHnzWtXW1hBgkTdBHMyci1xDrHtHlzNM7pLJDNMl3aamJks7d26XmXnAGYCdg7ESs0Jx8cL269svPZyjkgN0+jE4UqOKA/DFaLcNsc65YZNDrF9ztyX2pNqfri6W9AdJa3To0ItpP2E6e0P69TM9l6ec0r16Q773ve4X1IHuwu9J29GzBHEwcy5yfb+4D6C090FqZpAe1759i1VSUinpkOIBOHkw1gz17n2aZs9epYED69qvN2Ix+5vr5ACdaXWu4oQSAsoJsuQMsenKCZwrZSQvduDXAK/EntRqZRqF78buDTn9dNNzuWFD9+gNsd/sxx5rgvqsWebN168fX1sCQUGIRSEFcTBzLnLNGu4lg/Y+8Pp6f5paW/9DpaU7lBiA7YFcayX9TiNGnKja2hpZVuI5NP6eTg7Q6WckkdoIsR2Ra0/svn3NWrnSfGX/t7/Fp6swX+UXVmJd2aPqzCdMewqx1taubKF/nJNCRyIR/exn5s03cSJfWwJBQYhFIYV9ardc3y/uJYOtMvsgXa/0VB1xRKmyKcVL7vyL98QmB+jMdbW9ApAgA9CE3OQWYqO6884Kbdpkut8PHTIF0ffcc7FMt3xikLXnZxs16vMaOHC8+vQZq4EDJ2vUqC9kFXyzmd8tXlc2XJ35hGm/ePyu8+1q9vPY0mJ+BqHmBoBBiEW+uJ0/Dx36QKbe003wx0jk+n5xmwN94MAdMqE2uVfaOabmX3XgwEeSvi5pg5JL8aR4KZ5biDWqNGSIM0DbdbWpt3fccaauNgg9sQEYW5YbZ89j8gAue4607363UW1txZK2ac+eX8ptXlazbFq17HnT4vOzzZO0SdJ/SZqoQ4eKtHdvTFu3bpQJvon1JLbc53fr3HRZfvXEppvuxG2/5Mp+09uPKwijHwEYfs+1je7J6/wpPaqSkkq1tv63zHk7XFO7deRDX/JUhf/4R7MmT65QU5OleGZwTqdl9ldLi9lfJsgOkdRH5eVtamwslxTPH949sRH94hd1WrOmWvfd938Ui+1WUdFBtbRcLbPfB0g6StI4/fCHdbrmmgghtiOcB1H7ySgqktra4k/q9u32m+BCua8VLJlu+fi8rPFRkA8qXndi69V+O/MkXaIxY/qnBLjcFzKwu+o7Nnm4/YIpZIjNFNS9An427Dc7PbFAcNETi3zwPn9eoNZWSyNG3Kj33++v5uZinXhimz73uXAsotIV7xe7d3bKlEv06qv1kqYosT7WZvaXdLTMgK4abd7sPo++kzNTHXVURIsXz9d9912m1lbTkeecH9b0zFbpmGOCs9+7TTnBgQNuRc8lyjS6zhYfBelVdxKV9BNJt7vOV7dhw0se20nuNa7eU2BkMwrfj3KCTNOdeC/kkD1CLBBcXgvMAJ2RfhaCqerdu7+uvdYMZv7Vr8IzRqKrvrmIRCLasOF+STfJZIbNyjT9lZfkzBBf7MD8f8GCGh065H6et7/Bts/LQeiJ7TYhtrXV7U2QeXRdfHu73sRrNGSNTP3JgzJrD8+QqVl5UE1N8/T223s9tpPca1zNFBgVFab2pX//3Ebh+9ETm2m6k3RvnGwllxMQYpFPua5T3tMlf2MCdIVsZiFwDv4Ni658n5hMYE+b9bay7aBLlhysm5ub1dRkamtnz56h++77ozKd5+0yvyAM7ApdOYFbiDUvFLc3Qfqv7J2rVsRHQXrVqj4vUyubXLNjutgPHtzrsZ3krHG1a0pN4CvW88+3SSrXpz5VpUcfzf6TpR89sZkONOneOJnYb3b7OaUnFvnWkXXKezpqYpEPuSypHsYQ69bm5IHp2T0ue9qsacp2Wdn0orr00su0a5c5Bm7fXiTTQZf+PB+kntiQhdhmvfvuLZKeltSm//t/SyX10l//erpisf9V6pNaJTMYa5GSi8KlhTKfaowJE8rV2GgHW7fgu1tmsJd9uRlEZofRQ4c+kunmn5LSZmmetm9/R2VlX9Bbb21TS0ut7JPm1q0mCK9fP1OzZo3XSy+9ltX60H4M7Mp0oMn+jeMtqD2xYV6/G+5yr2NHGHvDEHzx86/3GJEwvvbSfXPhPHdnH2Jt2XfQpVejbduSj4GZz/NuIdYvAegMzlZU0kwdOvS8pDslvaRY7FFJExSNrpc0VqlTcdjd77+SNEHFxeYr+8suW6XkQUjx+dnOUWKtqgmh0gHFu9iTV874k0ywntf+0/6I9bakf5G95vFrr41TS4s9ytJZa3KyPvwwppUrL896fWg/ygncJ2K25fLGSRXkgV1hX78b7sK+GpAf7Flgdu7s2hIMyjp6tmyWVA9jCUu6NjvP3bl/w1GloiL3/WU66LJd2dLtGJj5PB+knlhZAbZp0yZLUvvPeZb0FUuqt8xL4x1LOqf9sg2WFG3/fYMltbX/TZslPWUdffQ5lhS1Bg0yt/v221b79Yn3F41Grdmz51nSuZZ0uiWdYkn/1H6fkw5vY9pS7/jd/he1pK9YpaVnWtJ068gjT7Okpx3XX2hJMZft5rW3O/lyy5I2WLNnz0vZNxdeaK5vaMj/82Dvl5Ejz7VKS0+xpKeS9vEGq6zsnPbH37H7uOgi83i2bDG//8//mN+vvDL9dm7PY1czrwm359v7+fFSiPb6LSyPceTI6R7Pqfk3cuR0v5sYOFu32sfdesexrM2S6q2ysnOsaDSa822+88477cePrrtNhI99niktvdCSplvl5Rdas2fPO/z8L1xo3pd/+pPPDc3BE0+YNo8fn3rd++/HjzWHDqVe73YcdR6f+va180p8f5ksEU3YNvl24lllniWN98gxbllqQ/vlUevxx83fTpoU3+7ZZ+N5rZBC1BPbKGmX4p8a7NkIdsn0bKauFSx9Ub17f0NXXml6Xe36Ua9PPfGFCNZpyJDnVVLyRUnL2m//KMUHiXn14EQk1apPn+MlrdGxxw5V4hRfXjWljXL/WkDy6hEqVE+ssxdy69Y/qaXlSUmrJX1e0niNHHnB4cFo+ZgnNgg9sfTYdU9hXw3ID9//vtfSl+mXy04n06wnHblNhI99/h0+3MxC8MILibMQZOqJDWJvfv56YqWiIjuvmP21efNamVzkfh629485d39G5pvkE5R6DLSz1IOSTlN8EHv8G+wglROEqCbWTjP2XmuUqSt1BkO76DnuiCNmqF+/xEl+s33BtLXZ9yFJ42TKFSbLO4xKUq/2hRbU/tP5d161JrmvD90VA7uyqfNMrRuMyEw1Jkn1mjJlVZfUDQa5nCDs63fDXTZ1eH4LWi32c885j4nJJqqhYZHHdd7Mh8CuvU2Elx2M2tqk0lLv650KMUizI+/FdHW8yTWx+RXV5Mn2/rEUHyfkVVsbkQm5RUrOVFL8vOycnYCBXRnZac0OgXawSF+EXFTUdji0Jv90k/hicoYXe5DYrYqvZZx8n82SFuvgwdclzdDbb7+e9HdeL5jcV+/q7MCubN/0hTrBJIfYIPXE5jJyFuFRXV2l9esr2uc4nqigrQYUxNkT8vGBjg+JcPLqoEkX9LpikGa6kGpZVofei15tbm5u1vXXxweGjx/fpkmTkgOxGTw+Zky8PSZDmNUxcwuNzv3zI8W/WXTmmsRjYJ8+C/XRR+7HwCD1xIaonKBc0rGKFxzbwSJ9EfKxx5YfDq3Z9MQmTubt/LrRWa5gr2XsZA/2+pIs6yVJa9TS8gUlDjbzWuDgWJfbiz8Gtx6hzpYTZPsVXqFPMEGcYivTgLYg9Nghd/ZKOFdeaUqQevfOba7mfEt8j+6Smad6uqTb1NRkacqUSwr+VWlxcdeXYFDWASdnT6xTul7NzpZ8ZRq8e8MNP+pQyYvb7AT2ff32t/bA8DX6298SBwpHo/HB4872mN7RCpmAmwvn/kn+9jqxDLO4+DRJq1Re7l0iaH/QIMTmpEpSk6TvSNogabRMsPAKhk9LWqizzqrqUIiVpF69ksOLXa7wJ6XORFAt82nG+SJfIDNScEP730UkrZCZXWGspGkaMWK6pCPVr9/3XB6D9+pdnS0nyPZNX+gTTHI5QUkAvivIZuQswikSieiuu0xdWXm5qSsLympA8fdo8mwoayQ9rldfva3gs2OMH9/1H+j4kBhMftWYZuqJdf9qvnOdLZk6dR55pF4dCcluWSObDqQFC7xrz+1Vs3Lj3D/J53Q716yV9Dt97GMnSqpRcbH3MZCe2A6JyAwoGi/pOpkdfqWkrTLBcJXMSlrnyQTElZLqVFoa6XCILS31CsivSuqlqVNXyv700rv3o3KvKzGfckpKTIH0ySdfpS9+8ThJf5G0Vo88slbSHfrUpx7Q7NmrNHCgub0RI9L3CHW2nCDbN32hTjBBLiewe+xmz45/Wg1Sjx06J6hLqcbfo14ntCkFH/h0002dWy7bDR8Sg8fPaQUzddC4vU8729mSqVPnww9j6khIdisnyKYDqetXx3Tun/Tn9JNPNuf0dDkpCOdlW4hCrGRC4R2SXpC0RaaH83eSrpL0d33sY0UaMOB0mYD4c9kzEjhX9rKs7EOsHUIvv9w544E9Sm+1qqt/Lntk4EknDZf7i9wMhIpEhktao9/+dq0WLoyPILTvr3dvM9Jwxoy1ku7WuHHlamho1D//8xzXT8Cd7YnN9k2f7gQjdd0JJsgDuyTnzBXxkaBB6bFD5wR1Far4ezQ4s2MMGpT49ePAgZ3/QOf8kHjUUeY4W1aWnw+JQRzBHkR+zhjhVU6QfL1TZztbMq9G2aKOhGS33uNsOpCyWR2zY4sjSN7fXptz+pe+VJXQdjduA7v8EoAvazsjcTaCm26Sfv5z6e9/j/9Fa2vikxGLZR9izXYR/fznNVq+PP3fZhr806uXeZG3tSW+OZPfqAcPRiVdplWr0heQd7YnNtuR2fYJpqqqWkuXLpJUrPLyNjU2lkvq+l5Ie58GqSe2a6UW67Pyl7+CGmLj79HgDHyyj4n2cffyy6U77uj87dofEi1L+s1vpJUrpbPO6vztOgVxoFxQ+TljREcGdiUO0jxZZgadzZJaVFq6QwcPfk7Nzc2ez2+m83e/fsU6dCj3mUzc2pz9QGHvv5HacgyxVSorcw5irZO0WCbMvqdevY5TLDZOUp3690/sYHNDOUGeFBWl1lA6e2LdfpcSP52ffvoMSdP07rvzFYuZT+d2r2Ay5ws00ydBZxe9882ZHEKfe87tq8Pdkh5UU5OlESNM78HGjfMlNXc4xObyFZ5bL2S6+eg6I7kntjvxKtZn5S9/BTXExt+j+xSUgU/53lf9+pmfBw50/W0zH232/JwxItPALjd2Z0tFxT2SPitTP75W0p/U0vKyVq68PO0xNtP5+4ILPuV5vjzppPk6ePCga+++W5uz6TXuqtUxzeOdL2m2LKtURx11raQJkmbLfJt9lqTHNHDgo7LP6dmUXTKwK4+Se+4yhdjk2p9XX10j6SEdOHCxWlrMKECvQOW8nUyh8OKLqw7fv1uItV/su3Ylf3XoHNTxhPburVdj40N6/XUzSvHddzsWfDLVeUpK+drNvBnyE7S8amLDuNSgl3TF+pxE/RPUEGu/R0eMsJTr7CX5ku/3Y9++5mc+QiyLlmTPzxkjOtITK5n3S79+/SXVKtdjbKbz989+dovr+dKE5mLPJePt87Oz7dl0IJlOpM4uK2uyjT0g9LXXHtXevc9J+oWkDyUtVXJwleLnXnpifVBUlHuITffp3B4FeOiQ+/05X5huofDEE+Oh8Igj4l306coJLCv5E3D6UYrLl3c8+HjVeVqW5VrUb0/vkc8ew+Se2O4UYjmJBlNnFgzJt0gkog0b7pd0k4Iw8Cnf78d89sQyH232sq0xzUeNsR1io9HE266tNR0p6TpuOnqMdZ6/jz/enL+HDk2sy3Y7X/br119vvLFYXqG5tjb1/Gzf1/Tp8awwcmTqfSVPfVVenrhqVrLU92bmbGNzWz0sLCE25DWxidzKCVpbE5+M5JrYTLU/0iLPr+yTn2T7RX7PPebEeMcd0he/aK6zQ1mmmlhTO+ushUnfvqYm79qkjq72k27iaMn+NNv5VbrcJM8TG9Reso7ozEk0aCs3ZdasyspwtDfor7H4Ca1aJ5ywSDt3FmvIkDadf365qqsLW8eZ731l98R++GHX33amWkTpgCor54fiNZtv2SwEkq8aYxNio7rkksu0bVvibUsN+sY3KvSpT7nftvsxtrn9Nhr1j3+8rTFjprk+r/b5+yc/kebPl5Yskc4+O/W461xwIFN++Mc/3M/PkUhE3/9+jR56yPy+fr103HEpfyXneXbz5sTQmBwgU78xzpxtbM4ckkuIZWBXF/PqiXV+Qknuic1mFGA25QRO9v0l3k/8snQh9thjy/Xee84C8uyWuE3WmQOMH0X9PaGcIPUkGj+4SsV6443XVVk5P+XgGr4BKWZw4tKl4Whv0EOsYU5o3/++dM010qJFUmVl4VuR/H7s6vdn797mZz56YtMPZn1EO3c2a+nSixWG12y+OQf0PvDAIu3fX6yRI9s0ZUr8g1Nl5fxOr5LlxgSjmvYAm3rbO3Z433bqMdYci8y3mdVqaSlSY2P659U+Huzb51yqNTFIm28k6zLmB/v8bAdOZ2fE/v3FMlNflau5uUrHHde519dHHyVfkjnb2JwddW7lBKWliSE5SD2xAcjRXacj5QSZan+ktqwGdiVsFTPF1N/8ZvwrlnvuMfWkXjWxtk9+MrkWJn37iorcvws1K4zY6yPnVn/p59duyeUE4QgY2Un8ii51AvtDh150HeQVvgEp4ar9DeNrzK8Pd/F9ZY5xK1d27VRV9uPKR4hNV4t45JH/rn377lRYXrOFYPdMnnuu+fr8yScTpxXMV3mUCUYdu+2zzkoug8j9WGS/xu+5J/3X8VVV1Rnzgz0rkZQ6/mbbNjP+RrpY06ZlLtPL9J5PDbGZs83hv3TpWHNelvwNNwO78iSbcoLkEJvNKECvmli3k59zBPpbb8XrSZ991tST7tnTnDbE9utnvjqcMcOuhXFb4jbevk98InVQRzQa1YMPPiFpssd26Q8wfhT194Se2MRi/Wple3ANXy1tuNob1MUOgsi8H+PHuHff7bpZNpqbm/XAA/MlTdOiRV0/h6vdu/iVr5hja58+8cGsQ4YMkXsPreTHazaI89kmH4vz1dlhAlLHbvvHP07uBMr9WGQfD159NfO2mfLDiBHx87N3Z0SZ3nxzmP7pny5IeK6TB1Enf2tbVOScfWCaJk40MyvFB2B3bIYDO++kC7H0xOZJNj2xyTWxmSbzl6py6onNtFzcXXdVu37qSZwUOaIf/MAuIH9MZWXugzqkhZo+PXVQx4IFNWppGaKOHmD8XAYyuSY2HyHWrxNEYrH+o8r24Bq+ASnham8Ye2L9YvZV1/e0271Uzz1nvpnYtSs/0895LTMs9VFQXrOFWC0rl2OgszzOud0bb7yufHR2mHNgxzpSBg9OHBBVVPS2cn1e7cdrSgHSb5tppoErrogvHODeGWF/ILxW77//14Tn2lwefz6Sj1OWlTz7QLxn12x7VcZs48YOsc4OtsQQ26xvf9sE5//5n3hwfvfdd913VZ51o5rYZtXWVuvFFxsltUp6R1KJGhqO14svSnYxdltbJOHF4DaZv9Smfv3K9eGHZhRgtgO7pMz1pFu3LkpbE2t/sjG3bWomi4t76YgjrtOBA63q3ftInXTSUTp0aJzeeKNOffum1tGYNvRWdhMqp0pX1G9W6arT0qWem3eIfeB4910zIGjNGlMneu+9bdq3r+sGV/hfX2oX6/9d2R5cs58cO5Gz/urgwVbt3heTVvgAACAASURBVG3eE8cee7z69FEeB610rL1+IcRmz7xPu75mPt1g0s7UV7pxe747+h7Lh3zvi44eA5ubo7r4Yud2VZKekfs3fh3v7DA9sXZHSm6LC5jnNj4gauDAaXrvvdwG8/XubbJCcXHm14QzPzz44CJ9+KGpHTbH1jr95S/x/ejeGeH8QHh4DyhxBgHzWFIXRvJ6nZRJGibpSlnWYEnXykS94zVkiLRjh1moyGued7cQW1pq/8/UGK9caV4DBw7E64Rnz77e9fbyzgqwTZs2WZLaf1pp/r1jSedYUr0lve34f6z9+rb238+xNm2KWk89Fd/WyXmbQ4bE/79unfv9/uUvqbczcuT0tG0dMmS6dd998d8fesj8nDrVbP+1r5nfH330Hc/HUVZ2jjVjRtSSLGvx4tT9Ztowr31bt3Y8Zc2ePS/lcTtFo1Hrq1+dZ0kXWr17T7fKyy9sv82o5zZul2XrwgvN8zhkiPdjjkajKdvlep+zZ6fbLxsS9oubzjxG5/bShY7HmPyvzSovv7BTbX7nnXessrLM7wmv/doZ6V97mfdxoTU1mbadcYbfLfFm779f/cr8vPtuf9rR2GhZUvpj3MiR03O+XXN8ye790FkffGBud/z4+GWdPS50pXzvi1wf64wZ5rpLLkneLtp+XNnQfjyxjysbOnVc+dznzG0PHep+2yec4H3b+/cnPp4RI9I91j9YAwaMcz0uSudYn/nMN3PaT//yL5Z14omJ7amrix9b3J/X9M+1ud78nvzYevVy29Y7N0jnWLfcEk373pUs69vfNj+PPdaZW+z/p9uftZad1wqpm5QTOD/N/ETpvs6/7bbqrHpenLUe2cwTa8um0DtdOYHtZz9L/5Xdiy+anhC3XmLThvlynyx5g0pLr844t2QkEtGvf22+dhs9OvMqXW77Ihdm+xrt2JHfAUHBqS/NvmQjl9XVbIm9Od7vifwMWvGeqLvQ85pmg57Y7Jl91fU184UsmXF7vjvyHsuXfO+Ljh4DX3gheTvnV/dflHRGwoI5Hf2Gxy6p+6//Spx3fdAgM0/qT3/qfdvJz+1ZZ3VsMJ90qywrlvbr+OTXxKFDbl/5x//vXaaXbgaBuNT5rDP17Cau+ClZuu225LrZVOl7YtO9dk71uDy/cg6x+/fv19y5czV06FD169dP48ePV11dXcbtHnzwQV166aUaPny4jjjiCA0fPlxXXHGFXn311Q41PJFzx6Z/g774YmPOJy2vmli3SdKzKfRON7DLDs+bN6d/HHv2NB5uQ3J90/bt2yW9quTJks3PX+niiz/nchBIrZG66qrsV+jKNcQmt/nJJ6dJ+nPax+wdMLOv7wpOfWn2Qc9tIY2RI8/XiBHfU3Fxqf75n+ekPObEE1Whg7s5uX3+86a9gwfP6JKTW76EKcTax4fOfmjsKHO/XV8zX8jBpG77zvkeO+aY6Sou9u81m+990dFjoPt29lf3D0v6+OEa487sL3vk+1FHJS4ucMUVpiPlqKO8bzv5vdy3r/fKlJkG873xxhuu29oLDiQ/xpaW1PvPPP7mHaV7rs317o/N/cNk+hU/Dx2qV2LdbOo5Mn2IzTRtV+HlXBN70UUX6dlnn9XixYs1cuRILV++XLNmzVIsFtOsWbM8t6upqdFxxx2nm2++WSNGjNC2bdt022236YwzztAzzzyj8vLODBZy7tjMb1C3k1a6k4JXTazb5dXVVVq6tEKmniW1nvTLX67LYmBX5qLyWMwcaN5/320uu3ckzZQ5uCxOaINZQi/5Q4f3vJ5ShVpbvetnbLmcVL1qsqQvpH3M7gfX3OYkDU7tmwl6s2fHa7HLy+O1VMkHSHu6G1OLHFVb22Vqarpd5jWW+pgTTzh+BPeIvvOdGq1bJ91wg/R//k8e7qKLhCnE+s3sqyqZE6D3RPi5Sj+Ha9cOJvWajcJ+j33969KDD5rJ5bPR1QuR5Htf5HoMtI/tmWpEnVM2dUb8HOh+vfNck7zvzZST8cUIpORjZ/x5HTVqhjLN8eq2rdeI/EOH0i+Va39Qmju3WvfdZ4+/eV/edcXPyIzvMZJvu7i4XLFY8usk3Yqf8cfmVnNrs6fqcp+dINNrwAe51B6sXbvWKioqslauXJlw+fnnn28NHTrUamtr89zWrYZlx44dVu/eva2rr77adRuvmtjevZNrMZy1IelrTMrKLkyocbUdOpT4t0OHxv+/cqV77Yhdz+q8nVjMrhUy9aSlpaae9JRTTD3pffdZ1v/7f/Ht7PrY8883219zjfn9pJPSP44jjzS1MmPHetWoRC3pK5Z0pmVq2C60pk6d51FXmr5G6phj5rU/rvhjTX7cLS2pl3nxrsnKvRYs1/rL4NTEeu/LzNtnfgyJ9VeFqzd0Pp6HHzY/f/jDLr35Lrd5s2lnPmtio9Ho4edl5EhzTJg92/396Mbep/ax49e/zl9b03nhBefxZV77a2u6NWxYbo8nWTQaba/h7tr6Sjd79qR/vufMsayjj87uthJrz7um3jzf+yLXY+D06ea6iy5Kv53kfuzM9NpPvr5/fzP+4re/TRx/cf315ufvf29uN92+N3WhUeurX423w37N2vfTu/epaY+LH//4hY5tMx+vJ0+2rEgk8bJ77019re3e7byf8y2vumJz+fmH/zYaTWzjUUdFreHDk7e9IOkxZV9za/+77DLzs7Q0ftnYsdmce2otO68VUk6n46uvvto66qijUsLqihUrrKKiImvDhg05N2D48OHWVHtUUxKvENu/f/LOc+7Y9G+0GTPmWY89lvpCTC6adobYZcvcbsuyVq9OvR1nmJMsa+RIc/nXv25+v+cey/qv/0q97eQQO3Vq+sfx8Y/PsyTLGjw4+xfpU0+l7mMTTtPfRp8+F1ptbenfyM4PAZl4D1yY1/6GzO7gatqRW0Dr7Aki3WPMJqgktzHTbbrff+bHnHiiKuygFfu2wxJiX37ZtLMjITab57wrgo69T++6K/7TD88/734sfOihzt92NBpt/1B+oTVgQO5BP1u7dqV/visrLevII7O7rXwNCLNfV/aHhK7cF7keA+0QW1/vvZ0dGpNleu1v3rzZ83p7AJe9P7/5TfPzd78zt51p30vzDofYd95xDnh6p/2YeJolPe25/Wc/6z742et4feaZljV4cOJl99yT+lprbnbez4WO9pjn2vycZ5kBufHz986diW085hjL2ro1/mFy2LDpLo8peRBmNOm+TrXsAdv2dQMGJLcjao0f79ze/TXw8Y+fZQU+xE6aNMmaOHFiyuWvvPKKVVRUZN2V45G1qanJKi4utr773e+6Xm+H2OnTr0x4gktL7Z3utmPtkdhPu77RHn88aj36aOoL0f50bv9zhti773Y/cP/2t6m3c/Bg4t/YIXbOHPP7b35jWb/4Rfz62lrzMznEPvhg+pGfn/98tP2FnH6ksPNF/PTTqfvYhO50txG1iopOt0aPju9/M2tBNOFxf/RR9mHMewYH+zE/5fqY3XuRcx8p3ZkThNdjzDaoJLcv3W1633/mx5x4ovJ+T6QLUR3tPbTb0dUhtrO9mV5efDHxRJPufpzXnXzy+VZp6SkZn/OuCDr23/sdYjdtcn/NdUWItSzL+vd/N7d3+eVdc3tu7B6tM890v/4rX7Gsvn2zu618zySQy7EhF7kcA+0Qu2VLfLu+fc12p5xif2COurYz02t/xIizM7437N+/8Q3zc/Vqc9uZ9r05VyW3IznMemeFX/86tfMh+f9O48al9uDbnVTOEPvOO852Zg7i9u/btydef8wx8Q9kkmU98YTzHGrnBuc+Sjdzwacs6TMe151jnX56Yt5yHh/tsLtu3TrLjxCbU03s7t27NWLEiJTLBw0adPj6bLW2tuqqq67SgAED9O1vfzvt3z700LmSviK79q+lxdRqxuc6M/WFn/60mSd2795SSddJh2s3Pmr/2UszZszQ0UcfJWmcnHUzXjMQSN4Du+I1sWZu04aGRrW0xNdDlqpUVBRJ+NtMy87a9TameL1OpmYlPn9tWVm5HnroDp13XrWkRr3//jbH40yWuU7JtMWrzsXUm1rWf2nLlnjt5W9+k7z/c6sr9K7JikhaoYEDvyDLGqq9e4s1cGCbZs50rxNtfwQetyV51bh61Uh1RiHnuczmMdv1V1/+crXWrWvUMceUqrX1Ou3bV6IjjjheJ50kz/pbKQjz6RauPc7Xbrr7+fOfZ6qoqFhvvLFY8Xkyb1Gm5zzT3NEdmVfVsnLepEt43W9Xtcd+LvJZp5zptmMx73rMZMEZKJqbjhwDY7H4di+9JD33nNTQIA0YIM95wzO99rdt2630g05T3xv2ay3TvjfnzOR2VCmxRtQ+x94q6ZAGDnxXQ4eeo8bGOh15pDmemMGy5nw7alT8/N7cnFjz7DY7gdtrLfEy7/pysyBBvL7c7TXpvC2TJZJzg73i5xSlr48tk/R1j+tu1fbtztrZSMK5zM4sxxzzXGoDC8CX4WSxWExz5szRhg0btGzZMg0dOjTDFmPlNgVG4psjon/7txr967+ulVkN6TFJg2WetBMk/bekl/XBB/Xavv0RSRdJiq9+0pEQay43o//s1VX+8Y/EVTNaW5sTbiP5AOm12IG53B75aUZnSms1fvx8TZ/+DW3fblbpiMWmyhSAu0lcWs7tDWXux2u0cY3MfnafgsS5/3M5iaWfweE1zZx5ni64wDzmf/mXTKNd/VtdzKmwU3dl95gjkYjmzTOvnxtueFR/+9sLkp7VF76wNuMoYhPK58tMzfJFxWe3eFBNTfMKvpa895KNnZ8mzDnQJ939vPlmmd5448eO6xqVzVKl6U+2u/W//7sj69Xj/F7m0SsAdlWItW/HeT9dvcJephDb1uY9mDeZH0t0F5rbc2L/P1PYzxQ0Lat32uudHwLsdtg/M+17qc0l8LpNE2afYx/V0KHH6/zzzVSSsVh89TR7VaytW+Pn9+TV09xmJ3B7XyT+jQmd550XnwHhlFOmt8+IkDigOvm2i4q8OsScj+kxSfaKn5vlfY5qVrpl6vfvD9ZS4U45hdjBgwe79rbu2bPn8PWZWJalr/1/9s48TKri6v+f2dmRpVmUfVhkQHCPmEVRFAUhMbwJolFxSSKSXRgTzWsSAZcZlyTGLSaCBhWSCAmCGyYkUUExRF+VUZAtgMh0CzLDNsxMd/3+OF1U3dt1l0ZFfZ7feZ5+Zvre23VrOXXq1Klzvueb3+SRRx5hzpw5jBs3Lsabf4AsovZnA8KQhgoKDDyH2XUsw42ROQIwi1+Qohp2T66Hp5lNpbx4rn5LbDA6gfud//mPf5GtRHZsbqgmO7VcsBIbBPf0b8IWabv/81nEwjAZu3cXeCld1+hyPx2YpIfXIpM/pqU+CIpLy5e/ivC2CG/ZROnN2W3Z+4ePPs5Ngj3Xwt/jF/Txxjx4sZUNcH39vR9betGPmj5uC7BfYfo4UrDGscQqFc8a/Emm6D7cZPeHS7F1UZSiWVDQGHrftQnQ74zqe9uAY+oRH70ok8lv8xyFTuCvv6EE3/9+NTAHGATA8uVrgMnYeK7xLLG5ZRuozbAUvMUh97xWbYDHHnuM8ePHM3680cl+8IMfBPz+46W8lNhhw4bx1ltvkfGNwhtvvAHA0KHhYLdKKa688krmzJnD73//ey688MKYb/4lsojan4vwd2xBARQdvKQXo3iL36G7E4SX39BQYz0b7U4Q9c73388PcDpsJ6frY+CevHh4bds2EJex81ncXLinrVsL/t5tt8mx8P79KWAq8+YdS1nZMZSVHc8RR5zIpEnf9S1cUvdLL83FAYx7xPxRWHoOr0XG9F+PHtLmrl3dbbZxRTXfxbHmbd++g7DNmdw/fPRxbhK8C0HYe/yCPt6YBy+2wScdUdblj0OZjDMPPm44Mv/m9eOwwMexxNp/XaT7avnyVykpuQx4kU86ScLHTTbPxXX7iFI0e/XqFHrf3gT4LbFhxhAx7FQelHWmHq45m0KUxTFs2rSVP/xBkgFs2fIWCxcuI+7m+dAssULvv2/wXN9+22vx1Xiuweu3UPDpgbbMdidYXjWH3MtkocsMTZo0iUWLFrFokdHJfvnLXwZV4OOlfBxon3rqKVVQUKDmz5/vuT569GjVo0cPlclkAn+byWTUFVdcoQoLC9XvYuLD6MAucKWdzYWHePRRk7bVBL/EC/zRwR36Ywd2zZzp/q0EaIWXX1Ii5evUfb/5jVKzZpn7t98ujtLdu4uj9BFHiKP06af7g9fk07ZtdCCXTfa9v/0tt49tx3D7eaWUGjgw2nFe0+7dwQ7vYaR/c9ZZ8veJJyRIqlWrzysYoXIdzV9Uffp8KSdQKh+IL++784scD3pH3OAd/72wMsP6S9Pjj8t3V/phpdRBJI4bblBq40b5/6tfjX5PFPxMaenQyDp+lIFdH0UATVDA1pIlMs9OOCHqPX74mnhjHhwNfnrsNunrOsj0/vs/fJ/aFDcwcflyt9zRsEcflnTKS82jH0fg1H//KzK3Uyd38N7550v5+/a5f5/bV0kF1ygJmjlWDRx4dmjAYT4BiociU/OhOOWfd54885//mGtDh8q12trwcqKQEGpqagLvd+niRSeYMkX+2uqH7stEQgLN+vc3EfUgQXr6ORmfS5QXASco2GmJKiwcpGBUAO/Jxw4c7thRYKls+t3v5Dk7sEvLYfsj6314gNfbb3uvd+yo1KZN5rsdaO7+hL3jEhWG1NC16zTPNRcP2WhSh5PyCuw655xzOOuss5gyZQr19fWUl5fz2GOP8eyzz/LII49QkN32XHHFFTz88MNs2LCBnj17AvC9732PBx98kMsvv5yhQ4fy0kvGj7OsrIzjjjsuT/Xbe1wAfncCveOKF/hz6JbY8PL1DibIEltXJ8FT7713E++9ZwJJ/vGP3OApaWM04LRSbmtb1E7OT8cfX8HatcGg23b/KxVcThzSv1dKrC/79pUDU8h1ND+VTZtuygmUOvT3fzQBWVVVlTz//ETWr//wAPBh4On+pBMahDrKh0+p/CyxLVq0obEx2PLZokWb6EI+QvqwAPBhAVtLl5p5Fv6eBCZIAuKC/uuTh8rKKhYsmEl9fRH9+6dJJhuor/90BAXFDUzMd57lmwjAb+H7OCzwyaTI3B07bmLHjtwgwQEDhBe2b09x4425dW9oaPD1VQJJ7QywglNPXRAoMz5tAZP50KH4xGre/9GPqpg7dyYlJUUMGOBN6qLnxl//OpMPPiiitDRNY2MFN9zg7Qt7jbDLnz27mhtugBkz4MknYeBAdz1kjv8cuBz4HeIaZJ+GaCoElpHJzEaCo6L1BwjP2GXX2bUOv/NOeAAczHTGzwRbYk0wmg4Khz7AtYBOkmMHka0HfhJw73r69ZtPbS2fSso7Y9eCBQu4/vrrueGGG9i5cyeDBw9m3rx5fP3rXz/4TCaTIZPJoKyRW7x4MQUFBTz44IM8+OCDnjL79OnDhg0bQt76OnAsYZF7mow7gT4+0H/DF79D94kNL79lS2/5/sCuxYvzy6jRoUMF9fXhimUmY/eDoehISS/99KeVzJsXL3LyozpmzGSwjmiCjnFGsHLlTTm/OzT6aCLHbWH80EMzUUoycA0b1gcYwumnT84uuLkZZWyKWuT8mxq9aQviUVthDcpU5KJu3dpRXx8svLt1axdZxofd2Nj0YTcJYUrau+/OAn7Opk2t2L37VUpKFtPUpBc5854+fUTQb9qkBb2gaUAlhYVXksn04aij4KyzclEf9GLb3Axz58LTT8P48WOpqYm3QH7cFBdBIZ/ArkNR2PbulcX3ueckEnzTpo3EVSLi0i23BMvc9etnceBAFTCdM8+8gI0bc+teUnIF8OuA0sNlxuFFMfloSI/tofjEgvD+ffdVM3cu9O2bi4Sg58bUqXDPPdC7N7zzDrRu7a6Hi9e0Ahe+mU8AdwMpSkqq6NjxJmprN+Pmez0f4ukPEO4TG6XERmXohNxMowUFQT6xskkTHrczYq4EplFU9ChlZTPZt89ejxZmf1tFcfFM31o1n9LST+fGCg4BnaB169b88pe/ZNu2bTQ0NPDqq696FFiA2bNnk06n6dWr18FrGzduJJ1OH1Rw7U+4Agvjxv2diopxJBISId25c27kHvgtsTrgZyTuwJ/lgPFZOnRLbHBgEVxPly6V1rO5ltgtW8J9av3Ba0OGBPsBFRWJH1CQYHHtmsN20h072v624nsJ45g0Kbf/PyqFRSltfcnPAnPoSmz0e2xfQekDt8+sFsZlZYKssGzZbF555S3mzbvoYFBKVN7qKB9Av8DV45ePJTYOnXrqMIJRL17K3o9+50dFth91cXH+vs/hAVt9gb+zY8cE1q5dSlPTvxChPorCwuMYOPBcJk9ewMqVC1m58s9MnryA9u3HUVQ0noqKy5k8uQszZvwDWMKtt8bLHa/UpysoKK7FM58xzdefNZlM8sc/il/gnj0yXxobRxOGvnIoffR//xcuc3ftqgGqswpsbt2bmo7kUK3DhxfF5KMllyU2rtzVsifsef/mOkghdJURpMS6+TVB+/bVTJ++BJn7rrHU8yFofX8xx+dZ6wn2O+MqsYWF0UgLUeu3aXtYsHk1hYUtOOUUg3gkz2uo0mo6d14C/B5RYGuAK3jlFfETdq1ZnzTlbYn9JOjnP/8Bxx9/PHfeCT/6ERx9NLzwQu5zXiXW4KWVlBSSyVxNOt0MtKF9+3bU1fXHtpA1NHgtZPaECrfE6qCoKubMMXiuegdTXOzFifVbYjOZ+Fh3ACUlspgPGVJFKjWTtm2L6NlTjmcWL57P++8LNIg+xrOPE26/vYITT/Qe44UpNjLxtFO4obvugscecz176GRPdmNdiW+BOfT3R7ln7GPEiIk51qQ5c6KP/8KsLkF5q6MsYnK8ZUjz1UdtiQ23fP40lnvERx0EpDcJzz4L27blh+8brqTdjgjt3OPhTCb3eFhbVJcuNXW4+26yz8erTybz0big5HtcH0TB2M1gz7ew9vnrIlbU+Kcc115bTX29f75cgViV7sFrGX8pNh/6KUphF5kcNg9LOFTrcJzNgt2PWnZfdln+Y2pTEJ8EnQi5yKWI+fkh6D3XXSfvscvwP5tKybrZ3CzPxrFqaopniTVUXKzrHsT3+roLr70Z2MaKFUsPjkc67e0TfRIaV4nt3buCbduiT1j95LbEhq8h6fRMS0/KpYaGXEvuvn3akpt7GvhJ02dCifVTcUCtvegEoBWwHj1gyBBYvFiujhuXZO5cGaSaGgPiHzRIQVZaozh4gaNdFGSJjePj6rmSkcW8X79qUikYPRr+9Ce517Wr/N2+PcmZZ+Ye4/3tbysZMcKreIUpsUELllyXY78hQ0QASTvyE4ou0haqmpokwcc4K3IsMKauJvGELUQrKy+nqupBz3Wpb7+Q97xMJtPM+vW3cCjHf/kqpJAfgDfkZ4nNR6nUls/vf7+Kxx4T4X300WlOOSUs8YSXPu5I9nwoXElbTb4uJX4sUb0o5GOZsl1Q9Aa4oiIdmoTCRpv4KP0r4/ocB20Wd+1KMmKEvy7jycdimTtfksBUxE9vIbKoFgF7aNMmxRNP/PGQlLqiojhxDGHzcAhe32ibwq3DUZuFD7NpDqIwPslHKXG5E3jXDxcPyHv+8Q95TyaTCK0TrGTLFnk2nXbXqa4uV8YrJWtPc3O8vikq0u0JcheoQE4A+pPrW5oA+nrGwTYipNPhSqxrzR0/vpIVK8Jd9+L7xIavIQUFRaFK7J49+bk4ftL0mVJitQAPU2Jdg3PgAJSUgFa85s9fiuzs4w1SkIIQd9cHwT6x3btX8P77QYvH08BeYCx6Ar36qmQK0cLALktPlOuvj+93FW2JzaXaWrNTq6nx+9xMJJXKX9DaR0VVVZXMm3c+DQ0/Qixip2Am9Qr69LmOqqo/O34v9Zozxy9En2bu3PNpbp6Dy0eoT5/XLT9HrzWssLCMfDPKaMpXIYU4i5x3wPT4xbHE5hPYBaJk3XVX9UGr+yuvQJs84rnycV84FAoKYHRRuJLWRL7Hw5mMd/7rRStum7VCkG/mJHtO5uNfGWWxjWsVDlLSH37YVZf8sunlzhd7MT3X8+yePU8yfvwUSktb522BPuaYCtavD1bY27atYO/empC6T6Ok5HSamh7E31cFBeEW9KjNwofZNAfRoZwIuSjaJzb4PZs2yXsymerIOjU3y7PptKtOSX7xiwtIJl3+nrL2xFHIjSW2kiOPnMi2bX6+H0lBwcUo1QW4w/eul4CfkEqlDvKabeiKcrtwzaGWLd0ZOvWJrk6+4Ce3JTZ6k+aKmTHl5G98+STpE8nYdagUR4l1DU5DA2QyBoetqekoDGi5xojT/o4zgKWk095MHC4KCwbT1Nws/pRvvCHl//KXY3nySeNbctppQT43S4AfIVYIAza/dauAfB84kAuArAXLqlXx/a4OxRI7Y0Z4gocPkz1JKVnYTzhhIXAckj54OHA87dufzAUXzGPlyj/nLFRS16B6LaO5eXZAfas55ZShnHKK+P126zbeh7NbRr4KjqY4GWX8lA+AN0RbYm1LwKFYRqOEbxh9GCX2o8YsDcOULC7eRtg4uY6H02nv/I9riY1KZhJFdrRzXP/KOAkDtFX4ggtkHrRq5fY5DtrYSnS1vy75+fzmzpeg9iWB21i37pZDSoDwwx+GJ0jp27cyou4bmDDhDCZPXkDLluKfPXCg4Fy3bBm+gQ/jw3ib5vx9ZqP4xB934SeXwup2J4h+j34+Tp3c7gTVWQXWvfbcdZe99qR48UUjQ2SNl7XXKLEJbr/dG/fRtu04YBlDh47EGFHsd50K3OJZ52xZ4FL2o9wJTMpYb4ZO468aHdNi1oDweVdaWhFqiY2y5LqML58kfWYssalUikcfFbP+88+7o7yDLLENDfDGG7aCowcpKIrvJZJJc8wSHtgVRkk2bbqAd94xyglynwAAIABJREFU5adSGVIpc4wjUX+5O7COHfeyc6dWvDSZHXnHjrJ7dk+I+EFRh6LEvvpq/Ij+fH329GQvKtKRpIY++CDY8iZ1DapXeH1ff30ml166hJdegptvhsmTzd24voI26TqedFK41cWvkEK0n+T69WLl0VbIKF8wewzztcQG/T4u5XNSYVPUMXk6bSwTYRYFm7SSNmVKFY8/PpOWLYvo21d4ccOGM/jXv/KD7/JbYrXcidtHH4USe+AAxJnncS22iUSCX/2qmnnz4LTTBK7IT0FKrDu6Oh4EmaZcK2WQHAtHF4iyVnbo4JW5HToU0b27ceOYMCEBVNKr10Q2b3bX/de/FmX1nXfgxRfFP7p3b/f6Y1OUC8kXvnBFQJvlFHHdus0MGjQ+tuU5lUqxdetOX5l++KXNXHbZ9MiyopXYeBH27jrlPutWYsNl+Vtv6bVH1vYNG9wWW6WMu4KswYZfRo6ERYsgmRxLWCpWe52zLbEuw1KUEhvHIOZ6xm2JDZ53cD2dO8+P4FN7zfPzivgD21boT5o+E0rszp07+frXpx1c1PbuDfZhDVJid+60mV8PUpAwPJV02hyzRPvEBlE1TU3hxzhyZGImUYsWUt+iorG4F1WAz7F3r0wg14SJ8vmyFa9DcSeIggPRi2ccnz09bv7JnjvRU1x6aRWrVrkDE+R3QfWKzl1fXS0uG9ddl+af/zSLw4fBJ7355kpeeMGtkAZBxIUtcpWVd1NRIQJl0KAiSkrSHHGE9EFTk1ug2EpPWGBX0GbjmmvMJvFwWWKjlK6WLWVe1tam+N//jb9BSiQS/Pzn1Tz+OHzhC/Dss3L90UdT/OtfbqHfvr37eNhviT1Ud4J8SZdfV5dk8+ZNxJnnceGz7HqFbxZzyURX2z/UyuKtFBZ+i0ymL+Xlab74RbfPb1VVJY8/PpHdu/U4BMmxDweLpy1wWuZeeinceae5r7MYPvLIfH7/+yqefnom27cXceSRac4+2133MHQbP4W5kLg3zcbY0thYxdq18Xyftfytr29plek23MTxuY32iY12hWpqEr9Zb51cz+7j0Uen8/vfG1/Uf/5Ty9o4Bppwv84dO4xrQ0ODtxQTvxLfGPRhLbFxlFjZtBoKhtgKd00oK0tEKLHaktuPICOfP7bmk6TPhBL7618/HMunJ8idIJMBpWyG1IMUz/cjTmpYt8IXVH4KeBx4hoceWoPLqhw1gaQ9biX2uOMqWLMmnuIVtpgG3fMqybk7tdpa2anFsQDphcSvvHrfLYL3D38IDkwQH+GoSFP/dSm3vv5eZLwLeO89r0D/MBHknTrlKqR+PycXuRY5vSBpgfLOO96NXH39fFIpchTRI480fBWkYHk3G9ORMVlNTc1rzJ17OnAGcENgoEUQ6fft3esOtgtSNqOUrqammUCS007LtbRELez79snfFi3MtbZtReh36lTFjh0yTuXladavr+BrX3OXIzJF/hYWGrnzcbsTaFm0cGE1TU0nEif48VBPZlwbm6OOcgdvDhhQwdatrrokgAn061fAunXVLFoEFQH7vkQiwXnnzeexx/Tiuw13ANWHS4AQBEjv/96unczDu+6C730Pbr0VvvENd5laic3nlMNPqVSKxsa95LY5SCErZ/36ngwYcC5dux6ZM6+M/H0cwyeHbsV2QUd5+y4oSAr0yVN9vXYHeDzk2aeAFKtWTcCe2+vWrQSeJEz5lbUJotb2hoaZB+u+f7/3rp5j7o2ZeZdtDAryif0olVjXRik42UEuqpCm4mJoakohiR9eRNakEoQPRiAufFOBnrgTQZz6qcI0/kz4xL755gbi+PQEuROArXiBwX5rJI7vRxx3Avfi5RK22jf3f4DX2bXLix2ayaSybQn3p9SZwFzvveGGcL8rG9vuUCyxw4ZpYWX8jI3f7mLq6u5hxIiJLF/+Ovn6dwUFDIT54EJV9ndBvkA60tRP0bnr/b6CGis3DJ/UboNWSIP8nOJSGOYmzOLll3/m9Ht87jnhq717U4FWNlO23nlPyNZzKc3NbwCTgIkkk/lhBApvJfntb8P9Mf0UpXTJBq46q8DGwyDVtHev/LWVWG2Z69vXjNMTT8g4BYF8+wPqDpc7gcicFK+/vgzhIzcGdnHxZBoaGhgyZKyVMMBF7pOZxka3H+3SpW6M44suCpc5n/tcJZDiuuvC/ZxbtLD9Ap+lvPynjjJ3x26P8wnfPPDLOd0H+q++H6ag5mOJdZH2W1637lrA3+bV5MpRLXunUFf3inNeGb9T2wfYVZamcJ/baHeCYB7o1UswzJuaXHWyn30R+DFwH25Zd2L2Ny56mQED9A4pfvKAIEtsz57hvqUnnmh2Y0GWWPskzHXf/84w8lti/WXFd99K8o9/nA+8ivTz68B/EIPIJOAqxJVvNWGnwZ8WTOPPhBKbThcSR9kMU2K7d7cZUpvbPyBO4E2cwC73ouRSRMMVsqYmWXy7dQufQC1aVAAp3nzTLAq7donjeiYDK1bM58tf9ipeX/xiruJ1KD6x06drATQdtxJ4KuvXT2PjxiT5Wkzcx1RxAwaCBONIiosvQxJc2Nf/TZxJqn0FbUU0DqD9Rxmd7w6E0EGJM9i69W+sXz+TIL5atqwqcDxN2UG8eSowixtvzC9gT9pfzQcfhCub/iCuKKVLNnCHBhqvldiyMqtER79I3VMsXepWuvRv/AtHPjixh0K7dony0tDQAeiCKxkJzAWKDibZaGw8h7gJAzTPvv22vWl6H+GzcQh/KOBr2IpsmzYmGUX37lKX8nKz2SssVMBE/vrX8M2Mt19MmUcdJWUWFo6jf3/la48dnDuad9+tdSYj0eRXLPxKbNDYfpxKrNlInkvumL5HrhwNXkf0vDKbwYRV5nZHWRz8fZhMjlZizXiBTgYiPDBvnpw8eU9EByOpxSVwF05GrIBHEiyXqygquoKg5ELf+IY20EQbgaIssaNHV9KjR3Aio5tuMsagKJ/YqADZOAqon8fC0876ycyRNWtGZ9O634Fb1t8EPIiMw6GfeBwu+ky4ExQVZYgDOxTkTgAwalQlq1fbfm8J4HREGLqct03gTZCAspnGrbC4jlfCjzmUEheGESP89fUeY6fTv6GubiLbt9/E9u1ex/WxYyfyyivzufHGav76V1P617+eezzYp4/7eBCCLbEmMOJc3MJGooebmjoQ9zgm3Cc27q5a6vWNb1TxyCMm9av4ky6kqupB5syZBUj+7nfeaQgt156k+QQp6cXuo8RJzbVO+n3bziMsCGHbNpN7278Ym7LDefO114Q34wbrSZ+Fl7l8+f86cDGnETYvS0oqaG5ew6EIWJc7gWucUinpXzso03ZX6NHDG/Spy4jauHxYdwKTpnoGBozdf6Q3jebmBzFzMzzAqrLybi67bDorV9awf7+4vGzfXpttd3Dwq5R5N/Ag11xTQ+vWwgs9e1bw3nuVLFqUOOg68PLL04lzjO2XOfok48EH4YoroEMHWL48leWZWUjGpQs99aurC/fxjHInCEL8qK/PdYtJpUR+Sl75KvbuFX/1fJNOeF1o/GM6mlw5Gu0XLCg++ne6zLGOsjSFW7GjfWK9rlBduhh/35qDe8o0UItY/G4CfoPhqZeByxG1JGhud6Vjx16MHbvgYHrvwYPT7N5dwdat82ndWvd1uGtD27YVDkusuMa98oq4xj3wQJpjjx3M1q2PAjNp06aIPXuMO5hktBSyDVrJZIprrxU+SSb1fBJozETCDZXlNpR5XfWuuSbX7TCeJdY7hzOZ85CNaXBad3kWDpVXDid9JpTYoUP7sXFjvCjvIEts+/bG2bmwcCaSlWUfJSVLaWq6Fy8W6csUFV2fjYJ2M1hBQRxLbCUlJRNparIXj3jwFSUlbufsRKKCFSvm079/FUGLwn//K4vCd79rC8IkM2bk4uuFAV4HKWHvv68nVyagLXqhtf2e/L6zu2lsVNnr5r3uHX50wIBZ/BLce281CxaIwmIHTWjhWlwMf/879OwZX6AfitLxUVpicwM+/L5t0VmIgsbTlB1Uhozdpk2bKS8fzZYtm2lqmk1UsN6uXSkgPAp5+/YdWZ9km4+vRXhyJlCOwNysBpooKdmGUmcABzgUAetyJ3CN0513hvsO7tsn/tx2Jj77bxQdKm9ImuoqwhfpVXiVIFuWzAC2U1HRnZNPrmD69N8wbtzUnODL5ubR2f+Dg1/hGmRxvJ93382NAH//fcMLqVS8YKyg/tOKRkGBP/gxGPM7yG/P/44gdwI9thqD+mc/C8InPZ9vfrMIuJVMJn7glU3BLjRJxDfYv6mL9gs+9dRBjqBUm2/cMjko8jwaJ9Z7zybdp8XFFTQ2VuLmqRHA74DvEz63i5k9u5o//xn27IHly2HSJNi6NSxCfwdwKzI3drFnTxcWL54OVLJ/fwJb0du/X8Y3lcqwdOlK5HRvPuPGJTyZKrdvT3HjjaKs7t6t4x16M2bMarZsuRWbT/bsMYmGNMa7TbkKaA2i6N9/sJxt27SiL+t1QYE3zqG+3j+eWultIHetIKB/weghgwjbCBzOtNihpD7FtGrVKgWo5557TpWXj1SwXEFayTRJZ7+PVJBUoNTChUrdeqvK3vd+fvEL839Rkfn/8suTCqYpGKNgXPbvNNW9e/LgMyNG5JZXVKTUl79svtfVud87aFBSTZ48TRUWSvmFhUMVZJzPSpvGKFDqyivd5Z1yivRNScmY0HIqKsaol1+2r01TsCLg+eUKpimlzDWllHrjDdeztapnz5HZsoLqoK8ns+OzOPt3hfW8d/xOO01+O2eOvHv48PzqvmWLubZrl1KtW8v/6bSXp0Cp4mKlNm6MLnfy5GkHfyfPq2ybpqmKijFq4MBxqqJijJo8eZpKJpMHn23ZUp6bNMk8p/lK86rdz/b//rrq65Mn++vq7/twfujUaYx69ln5ftFF3veYsl1l1PrGblq2z4P7TP+uc+eR2d8G16u0NGg+JBVMUVDu4JsVCoZG1sOmZFLmYbduMg87djTj9thj8rsTTzRl9O0b3p+tWsk8fe89KX/2bLl3883hMu3SS+W5554LHmsX6fsdO46z+sclE19QJSXHBtRbf8Y5xj5oDof1wzUKXgwcg/HjzRgcccQ4616uzG3X7liVTCbVRRd5y9F0++3yvUMHf79Ey0E/vfCC97mrrvLeHzJEri9bJt/vvDNKVlwS2g9+XnSNeUVFUDumKVjiGOtzI9udTCYd6+abCioUPKGCZHJ5+UiPPDv3XCn3iSdM3RMJubZiRW5b0mn5v3t38/xrr8m1tm2TqqSkIqTu2xUMCO3PU06R/uzYUa69+65So0bJ/w8/7JUh/fpNU61anangaEdbVygYqa66SvNj+Bqj566Wb337uvovmhf+8Y/ce9/+trfscPm2WMFpqqhojOrRQ68tU1Tbtl8KaKO/v8co77zxz8dzFQxXUOPgu1we0eVqfW3VqlVOfv+46DPhE9uhQwdWrJjPiBHia5NIaN+vBdgWRB0p7CLbzcDrs+IGGC4sdB8VaCosjONOAMXFcrzSooWUP3DgOcQBs4/C/fT6FuXUjubmIquMFLCMfAGvlXI9W82WLXpXF+S36/fFqkasan7/mxF4A7PMO739GQxOLlBVlZ662n0X5M8s5YeDnucGwJlAtpqa2axdO4iaGsWcOa9x1FGnM2nSd0mlUiglzz32mPH/s4P3/EExcSgXJN0//uE+1N26meMzvzuBKbszub6Tft+7GuI5+1fz/vs3ASeE1qtFiza4+TgBtAYexuX3B7fSps1VxBk7G+x/+3YJQNy50/hjisXYS3HRQQ63O4GJmLb9HLXv5Hm0bz+Vvn27ZJ9xkXG/gjDQeR0MGdYPbxHmwvLmm0ammEBVVzDoE9TX382IERPZv989N7QlNtfylz9SgV+uRbkTyPNhPtgpwvFEa5zJO8RH8S0uu2w67777Lu6ApRrcfrLbAp4HeJrGxr2cfvpklCqhffspiL/pKCSg+Lbsxy2TgwIjvUfX4mM5aZKdSGAqkyZ9l6FDJbFPKmV8yA2/J+jVqw/BVudJwK/IDW6TgEW4nvPPrySVSrFvn/h4fuEL41m+XPpz506bfxKMGFFNhw7HAbMdbTXxAhLcFL4+lpba16rZuNHlk/w+ubxgYhceffRvXHqpSbqgybtO6cDfIFe924FbSKcXs3WrXlv2snv3zQFt9Pu2ViCyPjg4W043pgJ385WvLKCiYhwDBxq969MCrwWE7f0/efJr9vffLxr/vfe6LQx//rPZsfs/N9/svv71r7uvH3WU+X/YsNz7paVKnX22+Z5KucupqJC2lJbK98mTk6p162irst8ioT8nnCDl5Vpivbup0tKh6pxzpilYnS13VMCuTn/GqWTSlDFw4DjVr5/Leujfwbnacrpj5xduff7iF+X7738v7auo8D+XVGefLXVr1UosoJdcYuq2aZN5trZWqTZt5P89e7w8BWKJXbPGlDt58rSsZW2cSiRyLatK6ef1bt1vndTteFGVl49UhYXfUVG7ev1d18k1E/3X7fGRnbp//IP5aurUpFqyRJ69+GJvmZMnT1MDB56pWrceqsTy+YIKtvjYFrXcj1id7TEPthiWl49UAweeHcIb4damfv3OzFoSZexcVnGlwqyNMh5f/KKMh22J7dMnnGdbthRL7IYN8o4HHpB7v/hFuEybPFmee/LJ8LEO4oWhQ6NPD6Laq09dlLLHK3e+ybj557JXZoTxQq9exuI7eLCuU3jd+vSZ5rmm6YYb5Hvbtv5+yd8S+89/ep+78kozDyoqxqiSErFujRolvHTHHf62+i1Xx4X2Q79+Z2cton55sUTBIOWVKS8q7zwJktt6fF7wPb9YFRcPcrzLf3oRv9/OOUeuL1wo32tra1Vhob897ykY4XxveflI9cwzIqfbtImyOuv6+fv4dNW69WkKkurmm2sD+nOFSiTMGgpKXXihUq1bh7e1bdszFUSfXkydan8PsmQe7/td0FqxQtnr/SWX+MsOmltRJyeu3/jlaFLB57PjdYkKO9GCaWrNmnA5pa99UpbYz4RPrCYdYNW6tft+WAYft4U2xfLlLh8S7TgtPiZvv517v7Aw4bH4RQX+aGgceV8hBQVXo1Qz0AZoBwzDtiqHWxChpKSCpibtr5IbfNHYmOHpp7W/62+RXbciDFx6xIiJB8vQfl25CSVsy4fLb3cj/ft3Yt0624crfho7pbI1yrG4JPje96p59lkBqn/mGenThx/OfT4oYlOXrRQey8Ds2dVs2AD/+hdMnQpXX50buDRwYAWyW69C+MPtJyjBJt8Ffh3Q3vxzTytlfAGNr+N0vP5K9lhcBzRQUdGRzp0r+Ne/5tOyZcIKZJAAleXLX2Xjxnd9/q212fZ9C+hDScl2mprssQv3RYV92brpiGpdr58jkciCSVhYuJ+TThoFwNq1QX5XTQHvAenvVoGg8TZF4c4KqoPXQj14cAWbNgX7g7VpU8H+/Waeat6KGwB4qEF/X/hCJW++GZyNR+MWB2Eb+5NsBGekSwCPUVLyRZqaXFitYKCuojA7pd5vvTUx+3zwWOzc6Z4bwZbY8ACeYcP6HAxa03O5Vy9vcMy+fQLA7/cLfu458WO85JL5GL/8FLmBbmNC+2HHjlrq6jRklCZJhy0R4o8ja1AJEp1fDLQH6rLPBo9P+/ajqas7Cp0UpbFxL+vWzXa86xTE+hbPh95lwdZ9f+211WQyfvl3Oyba3fve9etn8atfiQ95JuPKzKYpLLgtQ1HROCDBX/4yPRB/PJUyuPGm3uFt3b9/BxAehAxpnyU2KOvneb5y/D7lfr/Vc4GR7N5tB1drXcNVnyBZFtbGIXixhxPAQkQm/w2YE/A7Was+DPbx4aDPhDuBJh1ZHKTEKhXPnUAY6WrgS2zd6j3W0ke+jY01aDN7Y+NixCl8LwK2fCYNDUNZvvx05EgtGMFAZ9XIZMRsv3btBPbuXYpSrwL/B9yJLNZehACvEmvgMWpq5ChKqX1IAMwKhKmDYLu04Ao/bobmUBzS3Gxnmmx3jL8AvVi+/E+Ul1+POQ4KhzuxjzeDlVgDheKK/ldW8em0eSbI5SMIGqm+3o2P+Ze/TEAElj5SDzt6Cgp4g0PJPe1WeCrp2dPvCtEJ+Gr23YtYvXoJ3/qWwaSVcpI89ZS0b+3aY7MKrD3mXYGHkACLCnr27I4ZOzvIxEVP8d57KWQO2b9TyDwxmISZzGrmzbuIl156lT59NB973QKKi7cRxje2khREcVJcyiLnpW9/O9zVpGdPcVfwB3bFVWIP1Z1Ap6k+9lg/rJa4ViUSiYOBT5MnL6C4WJ4ZNGhcFvrIG8ApwRkuuZACKikrawlcgeB3+l153icMumvwYBP4IVHj82nVKhwRxDUWEKbEBo9T797TeemlN3Pm8tNPa7eet4Dp/OlPZwfC061fP4snnrAD6VzQVkMIl63FuOXFq8ixvl6DnkHwOn+D8P0RwMiQsjdw/vlnUVgormqrVy+htLQ1we4+ba06h8tkV2Ck7nu3C0q4TKzJwhNkMi7XKLJ/w3HbNW/897/RkIteCm9rOt2MQHwF9fMKoMKnxLqyfhaQu87quhqdw4z3UsRINIFnn7XdzNII/FiYq56fgtqYQvSWS/DO4U7ANygsbBlQHui1KiqV8idNn/LqeUmUmBT33qsxAbUvjviXZDKSHUi+jwKOA44BRnDrraOz17VyuhfBQnMrbTt2XI1hzhrgfOAW4E1kIX6dhoabs9ffygFMtkkWtmjA/tzfgN9npbFRBPH+/RcDadq1e5TCwmdwT+oUEplYQDi49PVAWUAZ4BUMUcpwhWcRlQU2zH9LfuPHbnQt8v4+thXXOJZY+7q/fP37pUvDkgocAaFR/PrZJuIq7X6yfec0f+diXspuvqiokNLSq4HhFBSMYODAc3MUFbtfNW7rnj26fW8RNeYVFfZ4VyN8am9QdJuWU1z8Q3bv1hYn/+/cfbppUzWnnDKUiy8WXikpMdiSo0adQRivDR8eHh2rfWFNikubtJwYQyq1FRjLhg3GT00rXQUFUq8OHUy9BPfUe2Ii/Zxi0SKv3+OkSeInqK8tXOjy3YtPws8Jvvzl8AQaGuqoSxd55vnnl2Sj9L1+bG6FYjvwZWAKe/a8BvwLsdxomXouojT/ETcviK/6hRdefpCXH3poPDCZgoLwuaGTuPgpWImVcRo1SsapUyczTiNGHMemTbfinssaWWECTU1HEebTunlzDVBJ587XIdjS/jmjZasfh1o2PJ07d7Xeb2PabiF8TdiBV27XonkWzqKk5EoaGhooKBBeUioqUYit6ITLcVfkuTltcL0jXCaKjzkHE8AIionZiJWVjaOsLBy3XfNGlL+6/2SvVavwthYWtkEMQkFxF1cClT4lVpfpV6j962wRMubhOsfevbYO0BfZvLjGfQPuPtI+7DZp3eEShDf/gliKz6Kw8BjgUTp1ivaf/7QrsUR7HHxy5PexuPrqcP+SqqrV2YjoJQHPLVfGL8jvi+f3wRlk3T8txG/kRQWnqddfd/vSDBmi1N690T5IGpVAf7QfUpQPWfv201SbNi7/Gd1XdnR4bhRiq1bDs9fD/dvM/aQ66qhwn16bzHvDf6MRIO67T37Xt29uHX77W9M3Sim1f7+5t3at+X/dOvGdA6W2bDF12bdPrhUVKfXvf3v9e045Rf7v1ClONHa4PzL0V2ERqrZPbCZjypg4cYoqKXFH0epo0DAfK/OMadecOfL/NdeIz7i37tFj/te/2mOnfatciB7XqNJSOwrW9Tt/+cns74aqAQOknLZtjU/r3/8ezjf//rc3OtZPxjf0O77xWK1gmKMPDT8++aQ8W1Iif3/wA2/Zxx8v1//9b/l+882ucQn2E+za1RsBHtQG//1vfUv+/u//usbL+HVq5IwWLcRv/N13g9+j/UGF98cpiUyOx7+aF0pL5bcDBoxR/fuLL/6RR+Yfvd2r1zRl85duR3m5XC8udveLHi/bJznY99Key9HzoFMnuT9rVlK1bn1KwHO6zkOV3z/b1MPPI1FINUMPlj1x4hQVFmEPNeqSS6aFoH342xw8t/zoBHotmjcvrF/D17fevWV9KynJHTtQaujQaH9v4Q2lunaNv5ZOmqTU0KHaB/QSJbJonIIzFHxOCRKCXuvdcg3OVKDUjBne8e7VKyjWxC7n6GwZYWg+/npfrURuLFGC0GKPexA6TFLBiQouttoYPY9PPDHaf37Tptwxc83BT8onNkRsfvLk75Sjjw7v8C5dTlPhwQPJ7MBuV15HbtcCZAs2VxCNV+E977xc+CQQJVbgt+IqifLRkCFRjF9aOka1aeN6Jl4gxciR02K9xxYMTz7pbb8EmV2tRFkwC8+ll9p9Yn7TubPcv+gic/9zn5Oy771Xxr5379x6/PrX8lcrsbI5kM/bb5t3lJePUQUFIoQmTDBK0e7d8mxhoVIvveSdkCefLP936BA2TkklAsV2hnfxznYlQsgfdOEN3gOlmprsMsKd7EUpiw7ssdv14IPy/49+pNT8+X4+ix7zZ56xxy48gKWkxB/UEPa7oH67RJWUVKjy8jFZmCvDV5pvtGK2fr200SVYldKL7XZlghheVKJYhsHXvKhgmvrrX73tOPpor3LYoYPUQUMMnXyya1ziQ7gFtcF///LL5e/118fpT6PkRCn8Sin14x/H5wv/9f795e+6daI4hMtg99woLx+pzjxTB6K621FQ4NokGyX2xhvNveCgNX8bw9vbubO09447oqHXdN/YZDZT/j4JUohz73uD9fzrz6kKBmbvX6OCeW6Jks2bVlyT2edPV3Cs6t//bGdg5OjR8vtHH/W3J4jXc4Oyunc/TUFSFRXljh0oNWiQUlOmhG9aR48WuXnSSWEwfy8qe5M1aZJSgwbVKrDhp/Rc0cau6OAmyIXvfPnlpGrT5oQIfhjNKYmpAAAgAElEQVSujCEprg4wJlvHaSpXEQ3qo8WqoEDzgK5PeGAsjFG/+EVStWsXbmDavNlsdF1BtLrM/6/EOsjGiRWs1fCda3Gxvu+ylOkdzagsc9gWSv+kTCqwmdNenONFG+rP0KFK7diR/8KgcVNtC6gLz7a4+GzVo4dLqMSLDv/d73R9o3dk+vuLL3rvJxK6T55UZud6rBJ8umOy343CqrE0bWxdrUTec4/c69Ejtx5aiJx7rjyzZ4+59/zzQePypGrTZqgaOPBs1b+/6bfFi70WS4lMT6rS0iihdKYSxepoJQtx0KKRVKKQneAZLz9/NDQoZSyF0RHD8Z4x7dJR8z/8ocriodq/jx7zRYtcPOV+d7AVKGyTFX9eVVVJm7p0kf796lenZdsr/etfgEWJ0e/R82e4Co+4l7n4+OPx6rVokbzPbR2KHitN9pj5yVjrTRTzT37iLy98LM8/PxcH2k9GiQ3HdJW57eVjvemsqVFqwoSotm/PjsMYVVbmXRDF2hYPWcFuT/6WWLuN4e885hiRfdXVKov4Ei0nbTJ4rX6+C0PmSGfvy/dga65SMFW5Lazbs/U5V8m6V6HgCtWhw3eUfx2BpPrgAzdfaCV27lzTnoIC/5qiN+7B+LP+kzq7veXlIqNsfisr89bvvPPk2enTV2cRGPxIDi+qwsJBSvBN5dlJk5Rq184/Zv5NRfAa2a2bWdMFL9h81qxRasyYcOVd+kQbzOLqAFGGBv2ec5UYCMYo92lxtNJ8xx0GK79zZ9Pn7dubteq114LRIOS6PPf/cWJDaPLkHzNnzgQymb6EYzeWZu/bPjPaL0T7o5QifizakduPoaqfH4LxMWmEg34j+fm2gvZji/YltckEduk0fbnYivBVmps306fP5eT687jyZptAkNLS77BihZ2mL8jZ3mCxavL7pdXVVSOpQquBM7K/uxfjP/wsEnDkxUi1/VL9PrGuYCYd2KdJPwtw++2ucXkf8QF9gLVrn2bdOhO8961veety4ICMe2PjAML9d49DUm3+i9LSvyDBGC6/0gQwmzZtuhLktwjw3ntJ4O+IT16ciOH8oortTFLS3zYfBgfFFBfLmHv9kMN5uFevTgH3Xf5afl+y+PNKB0kuWCABO3o+aNxX7T8swSn6PToA8Si8AS5+Ep86M//C63XPPVXZOuXvJxg397jN5/5AMkPhwS6vv56LAx1M4Ziuwv/e+aPrdeCADnINa3tXoBewhOHDJSBp9uxqEokEO3f622H7kN4MPM3kyX4fcTeZoDW7DB1HsRkj08OD+L70JRPEd8UV0ZjV4MWEPf30yZx00mDatt3n65NhBAfGvZS9L9TUpPvTz49JZP3SPr1a3v8BSas+AZE9S4E3gCvZu3c1EpHulUtRwYaa5xKJBCUl/jXlcuA4jjjiVqIwwV3U3KzLN4HC5eXe+un3L1s2m+bmOxE/bTu4cSGZzB3IOm9o/34/T+nvtmzIxVwuLZ2aRfsQme31iRV5+s1van5YQu5c+RuC2qARXaJ8c7UOYPsuu+aR7qMngR7AEgoKXAF90QHVhYXa/7+aKVOWMHSo9Hl5uVmrbropOE5EEFCC0EYOD30mlNitW7+DdGD4oBQUaGXTfk5P+vcxASeNiCP3NCSAoQO5kBi3YYIWOmGETb6RkVohjSP8/L8BA/nlYiJJ07d+/YPIJJyLKOfHAO9YfeBP6PAE7dodSSKR8EBNvfCCdyL36ZObUAJyF9CmphpEEbsJEahBdRWGd6EL+NN2upRYCYaZzvPPy+Jw0kkmqO+NN+xxsYP73FHH27Z5J9/WrVoR35L96w/SeBH4MWacErRuXU1xcfjGKgqJYNq0GRgw6jgRw/lFFdv9Kf9X0rat5sNOyNg+DpyJDtpJJBbQo4eMuVeJDV/sFy26N2AjNBK4DG+fKrz9Fj2vtDK3Z0+wYmkDtYsS4494tuFrXCTC3cy/eFHXJgmBTQcc18x74uYed+VHzxf0X5SguBQWia9Tznrnj+6vxkatxMZDJPEHjXiTuLiU6P/joYe8mxXITeABErTWu7eW8X5FfDhms+pXYs4CTmbECAniE0QI6Xsd8Netm9coMGyYlpMKyEU3mTfvYhoaNCSZpkqCA+N+ir0mGCg01+bPD2avE4XMxjVHGhvdioetxNoBps8/L4r/b39rbx5cSYLupqSkHWFBcq71EaRv/Uq0RqPRpHleUi+f43h/dfZ6je93/rmhv/vhIu3ynqRly160aWPWvbIyb33SaWjRIk5Cn5OQMQ0Ori4ru56WLfV428puXGQf1/yPNpwVFBjkpoICMx9thf211/LXeQ4nfSaUWBia/Rs+KB06aEuQ/ZweAD3IlUi0fGdk0b4Nsc4q3/O2YMsAFyOLcPzISE06orioaD69ei2gZctxtGnjzjrm/Q3Z+roiYjWNoK6uJlt/G8boPIzi7bdEnElz815SqZRnMezY0TuRf/c7t/UwN/d4ESbSPZrh9URxQWQFW2KTPPywLGh79sji8PbbBhLtwAEwlomJiOKUJq5A3bdPK+K3AX8ld5d/P8KHpi9k4QwXMqLcBFGSRYv+juG/OBHD4c+ceKLXom9nktKWjvPOm38QDaC4+AoqKt6ie/cTEYv5MwwYUH1w4fYqsTInbOgmOJuuXX9CUVEJX/nKtRQVFQI/QSLYdd8tQ/rT9GlhoT/KNv68kk1TMI/prGFVVZWUlPhhusLga0DD6RglNl7Udc+e/nGJgiN7KXbu8XiW2HA+jANHZqiSNm2CIvE1eeePrldjI9m5GO/kya98msxeEGYF92eVUgFNl/Jvc5RxG7JZ1bBDCQRG8adIXz7FxReLdVi3rblZK+gJBgzwKlCjR2s5GVTnflmesvnBXmPOBEZQXu5eE044Qfennx9r8K5f9vX8FA+tRNoZ7mpqFrNvnyj+L7xgNg9B/Z0PcoBNxhJryK/E6nfm/w7/3NDfo2W3XSeXJVbko940BK01VQhM3TrgMWR8BSVADE7zGDx4flYhBq+yGyar7Hnkakswakb79mI4i6PEHuqYHi76jCixugPDrZnf+969dOlyHV54Cj0AdrrGM7L3NiCMZwtc1+7sX8ju/TpgDfF2RtmaFxgB36JFguOOq2bIkCWMHx98xAy2JTYB9CGMiUSJ9AtPvct3H3Ps2nUzI0ZM5IMPjDXDL0SCsG/dC6hrd5tbVygKtcQaQeX/bTV1dcHHurt21YIHt28ZuRaK3Lpo8iriLivDHGCTp4RMRmPwBad/TKf34oKD021qajoSw3/BO3WTSjXcGjprltein+tOAC1bJrj7bmlf166/5+STK9i1qwYRtGN5553pKCV1zIWOE+imzp2XIFiyGWprb2Ht2qdZu3YRa9c+i0DRNQG/x/D4YE+ftmlThndBj48lHPeYPpFIMGGCnuuaKhCFwdWHyxEsx0qfO0/0JuXcc/3jUo0oRW44srKyKZ7UuGEUzxIbrjQefXRFoOKRSwnOOms+7dqFY7p6NxYAKWbOnM7LL48FXqeo6DJc+LKdO5uTJ78S2769ywDhIjvFcS5pRWzTplLcyoUGfJ8KjKOwUKC5bAVSzxfNC+m01+Jsk/keVOdqvKd7Nl7n+cBOYBELFrjXhBtv1Pzlt+YW4R77QzW2SDID9/FxOevX92TAgHNpanLJM8hvHnvf7Zf5fvcxzfPuUw/3O5SCoiJ//+jv4XMmkajw1ClYiYUo95mCgl506rQAcbtYk332WOAfwF0UFCQoPph6ymxuevd+jZIS9zyyT3BLS11t0eXcT6tWJ3PEEWJUOProBVx0kfB4kBJrW53NKYCLwiEjDwd9RjJ22cfiuRmi5AhhPl27JpgxYz7f/nYV7dsXotTV1Nfvx2vlOgW4AVHsbOuszoLTTO5RJ8gi/HfatDmePXt0Of7sG1rApNAZv7ZsqWL0aLm/f3+aVasqOOKISkpKchVXm3IzdrnqBIaJ/Jk8dF99DXd2qf6sX9+TH//4XETZS3Plld5MNmJRcbzRuYCuwru7Da6rK398sE+s7uOnCcv0I+OmcfuqgBkYC4WN0WiP10ZgOqlUJV5F3EV+wZ+kvv4CMplrEeuNPzvSUxQVXcOuXXOy1wuy1+0MaNqKMh3BrJyF7NRvy9a/CdjMl798Ng88YOeqtudAM+IzXQx05ayzJiObnkKGDNlAKiXH53/7WwUDB8rYKqUXrCS1tRcwZ443U1EqtZJdu6SODQ1hfOrPRqP7yfZjtbPu6P5/lfr6RkQI637TfrMuhUMWHKOEhfFYLbW1mxkyZGxWmd1H27ZT2L373my99Fy/BnGj0HJkNwUF76PUH4GEz50nOCNU//5iCWnVSuZbr15VbN48E/G5rEKOEm15JZbg9u0TB8dT2iV9M2SIySx18skVVFVVeo40g5VYW4blZum68sr5eSVYaNUqQY8eHampiZI7Qo2NkrnomWcML6XT3uxvACNGVHDeefO5/nppk1+JHTSoknff1e2I71PsV9CNInZTSBnaN3cRRxwhGd/s+tgWWID6+hR33SXy49VXvRkcGxv1GAXVWcslNz+IzPW77xjq0MGW53b2pTRe+aHHPmgdgyDFQ/OHO8NdDTAJuJ+6OluevYyd0bFr1wp27vSvj68imLeNQCmDBo3m1FOHYa81cSyx+n6PHhUkk8Fz0h9fUlJSSWOjPTdsGXAduXPmJcrKfsqJJ853WGLNGnL++UU0N2seCM9kWFBQTLdu1ezY4biNrPfehExiSHniCejWLcXAgVXs2nUThme6IuvDGUApDQ37EIOLdiHRbVkHbOH++5/itdcS3H47nHOOUchtxTXIEnv88RWsWRO/vw83fUaU2DeBE7L/aysZyGRecPB7JmOOxC+6CO6+G9q3n059vbZy2Yw8Hzny1NZZrRhoYH5XmsWX+dKXPs+aNdexfv01iNO2FtrvI5aXVcDZSNrAD9i163527RKhnslk2Lp1JcnkRIYPz3UhsMmrxIYvpJICU+/ubAo65pAFB25i/34jkB55xFawEnlYYiuRyfRSZF1thne5E3h9Yk09ze7VRYW0b9+VPXuuw2sRHmTVxS7LKGwgqSXLyobQ2Lia+ILfTr14It6FaTeQIp3WAsXU06vg6TpuwPCfVrALkKxXA7nnnrtIeFhFzwHdpvuQ9KkFCFD9V4E7qKkxY/vOOyu5+WYZW6W0klZNc7NbCW1qkjo2NNhKqCEZr/B0rt70urqu04FXgG7APIwvWTNyUvA7hF/DUqVWkE67eCwJnE9d3X2+hfYZSkq+nbV6lwGFlJRU09RUlv2eBk6kT59KNm0SJd/Mv3DlcNIkqZd21Rg+vJrNm0Es7zqwshLv2L5Fff0OUqkUiUQiG9wnvFlTY3izpmYlzz8/keeeM7IiWInVrh5VzJkjfFhRkebttyvIZObTqpU3TTaI36OdXnnHDqOUFRQkQtKDgn8uHzjg2tDo7G9GTn/jG14rpt8nVjb3ei5sxD0fU8CtbNq0EennNLff7t2AG0UselMNWFYwo6TMmlXEAw+kOXCgAriMhx76DnV10wFFY+NbyFiuAs6gtvaPiDIa9D470NY1p8YDwYYD7ZIGf8LLjxXAekyf/S+iMO4hbB1zKR5aic1NZqBdtH4LlCP9rHk5DfREUpjezckn6/TCen2chvTRvejN/Nq1mWyqabPWuJRYvyFH3z/nnErq6nRa5X7Ipn810ERh4TYymTPQhiSlIJ02PNWz50x27SqiqamQoqJq9u4tQE5fmmnRog0NDe3o0GEY5eXzKStLeOq0b593Ddm82TZMPE3YJry4uCJHKbepudmvxAoVFsqJ0sCB1axcqa+uRk5W5+A1kDwNXEzv3n1paGhFba2ez/Pp0CFxsPziYq/iqq/v25finXeE9//5T7NJ+8EPLmflyqnONNbl5dezfr2RzZ8IHVYshDxJQzb06HGiCsMx05AR99yjAd2VmjJFyjj66DDIkXKVCwasn/fDd8j7XnopqZLJpCoqOs36rQv25BoVhj03aNC0gHvy6dXLVafcPigsHKmOPTapguE7XDAb8WBi/vAHd92eesp1vUYJBqGGWPHX9cWD41VdLWPz3/+a3w8eLH9vv13uSbICu57h8CSC32hDo2msPV2XMPzE5apNm6tVHPxQ892GMHMBZFeE1leguk7w1dHfX/0VfEcNGGDwSb0wXfljk8I0dcklSr37bnSfwhh13XW595TSMFf5YB9PUwaXcWTAeCSVwJcNUTBYFRYel+2j7yhIqltukXd36hQ0H8KB9O3x69cv95nycqUKCuT/qipvvbp182Iktmol4zB3rkAOHXec3G/VSvOA5sMgiK4XD4LKX3xx+JgJnrJ8P+MM+Tt1qrvPlfL+X1ws/y9apFR9vbm3fXswbA6MVF/7msi5RCIcQzJ3PgTzEgjW8223mXtf+pJX5p91VhQvh0OeVVYKhJPBiI0n6448Uqna2rCyhypYHHB/uSouHqaMLLAh3bRciEpsIP2zdKl7XLdv98+R4QqGqoKCoUoA+19QgoGs66fbkruOFRXlQkGCQEYp5YIm05CU2wPav0TJWnq2atdunBLZNkQZmRnd/6WlSk2eHCZLDOzkrFky50pLp6iCgrAEEEn1ta9JchtdxqJFSl16qVKf/7yGgjOf+++Xv8ceK/cvvVSphx829886K6wtfgxe71xp2zapunVTqkULd9v691eqT5/c688/L/isrVrZ68sQFbZO9e592sHEQPqzZImB0Lv2WnVQrt9zj1I33CDzqmNHN+/37TtS1dTU5CRS+bTgxH4mLLFz5tzC3LkLWLlypueobc4crzVTKbOrUEr+tmwpu7CRI6uora1hw4YiGhoKOOGEY1m16teUlEzNWp30DqMTsnv8NnLMri01sqPp1ClBIkEW0kLvulxWiLes7/5j7GY2btyGcTvIJe8u1Owk27efyYEDRTQ0pGnbVqwskgIzyALqtwxoSLFoC1qQVcB9LDkYsaxNQY63J2ffWZL9W4pYZiYzb14Fl15aSSZj2q7L1OMm321LX7iFd8iQCjZuTGByjVfgtXA+g9sCIm0+cGAm8EeKiy+gufkevNbAl+ja9afU1to7Tp1O0G3dlfcFWY7fB94FTsZrRbGPGFsDLYCLeOedMHcE17Ff+NhmMpq/ot0nXMebeoziWrlMvRTSVzch6CB+C2caOXr8HfA5Mhlvm/fs0X5cMh9GjariuedMn7VvX0tdXVggn7EM57rruH1PhRKUl1ezfbt8W70ajjxSLBe/+tXVXHbZMpqaZgNV7Nun63wZYglbiNvl4tSDwUmvvBI+ZqtWmXoHW2L9lOKyy6pobhaZc/XVab74RWOtrKy0/R7teslJwapVVSQS1VRWzmf6dD9viiz0yq54rjjNzd6+9bsTGN4CtxW8KvvdX+9yoCe/+tW5/OUvR2attMoqYxoSuKktqLuRefhHQKxT114b5h7TGS/yin1/RFZmVGXfdz7CA3dg5MI0otxlIErm2pbA3wAFKCUnDXBVti7abQaMXJmFHOV/AIykU6f5JJO5646WwbkW+BqgDWLx9Lf//ez1ucDnqK/X/D+KKFgte066LLF+sl3OEokESrVGqdmEnXal09We9aqwUD4GrcWQPkLPZMQi+eabNTzzjOH5t99+PaQt51BQcAdKLcA1V5SCHTumo1SN757Mx6Ym+zRAU5ILL7yALVv868sxuNdBgFN4770dvnnktbgWF5t5Z65Xs3Onm/c3bpxFVdWD2bTVn0I6rCpznhSl2ft3IXfdpQ5m2rnqKnlGg+gvWiTfv/AF+f6b38jfwYO9qRqDQOn1Z906Kae42E5C4ALI1/eDLTGu5Aj607mze8f2ve8pVVEhu8ujj1aqVSulhg/X9YiyTum6uFLl5db9nnvc9xcudF3PL+1meflI9fLLpu06zay20sqO1Q+6HmwVeuqppO+5Jb7nXVZD21pyvIIxqkcPkyEKxqmCAtlxPvCAf5y0xTVoZx4GqK/TPwaDbIdbhbUFw9WmaOvohRcKH8exnl19de695malEgml8kmQYawIdjISv7UqPE3i8ccL0L2eGyYhgXzCMzR5+6Zbt9z7vXsbS+wvfuHlDxt4vaamRpWV6eQpQdl+kkp4388H3jaXlg5VbduGZ26SJB3y/6mnyt9vf9v9rMhFey7qzD/69Gmggi+o0tIhoWPfvr0kYrj7bpN6N/wTzxJbVaXUzJnm3umne2X6mWfm9uNXvjJNFRePUaWlQRZNV3ttXopOM9yvX5zkCHHB6v1pjvW4uy2jXbuadcDP0/ojp1ZR8+24WPXr2NH9jtdflzEwyRls2RmUaCWoTi7g/vA5eeGF4Tz2+c/LX52VraAgejxGjfLOt169JC3y8ccn1Ze/7P3N3LnCS2VlbotkUZFOWuBOPFRYeHZAXWqzySGCLcZHHqnUwIH+3wX1bVBmRF2fo9WIEV4d5qmnTKrqn/1MW18lzbvMx/iJWTT5s3j17ft5FaavfVz0GUEnCCMDH3XjjeP5znckYnLfPomYLCmRp+xdCEDr1vK3rEyirVevXsKaNeGIAWDvYOwkBDbOrCbt6B0fa9GmXEuRtHPu3FHU1BxHOn0Ma9eOYN++0fz3v9Ozz3hxXhOJcZSVtaFPn58gVqGqbF1ckCyajAUtyCfW71sn5Grn7Yg1Ql9LIRa4GaxfX8SoUeeio1t1e70+sXZUZC4gdWnpcHQ0cfv2Cd9zy5B+vhrBhFzna7P289KoDauAJ9i69WLE52gOsIiiIgFil8AdmyqA/xAcPX0CwagFqxArRW6bBHplKnIKELTb1hA5rqjR6EhSpTR/RcMguSxDxrKRD/axHTin3+tHgTiKMEi0rVu90ei5PmY2LqsfVm4MEmwlciHKEvvBB17+OHBA44uOZNiw8zlwYC8Cqq7xp110bPZ+MO5pY+P/sXt3S8LGzIbH8s8Tf1sHDRLYM7EG9UMsdxrw/hGkj6tpbOxHmOVU0DpkrF2+erkUzUu6PL9lzCaXr++MGdV06bKEIUMWIYFY/npr2WO391kk4HI5Mk73E4ZdXVzs8gW1KU7gZzMyDv8gl4/tuT4cAz+3gBtvNFbtcEtsGFpDXyTQJ9oaHiTX9bgkEglWrBAoPanjRuSkzY+5HFSnJILkosgHrSCoXpqU8v/1j4c9578CbGDZslHY823z5idYt24Cq1dPZP9+b8IMscRWc+CAtvR7UXDS6SOQtcFbpk48lMkY+eKlGSjlxivX/Oe2xAaNt518KVemwGpWrJiAnZDEb4nNDebKLzGLDcOm37tx4y8Dfv/x0mdcifUOYCq1iC1bBDv0L38RPDutxOpB0wOplVi/EI0ircSWlemjAJdSmMRgRB4aULBXUdTtHMnOnRnkyOh1MplFwDHs2vVvZOH6Rvb5OcAirr56CZ063c3KlX+mpGQBJrtUvAUnPyXWlWlnmXXNP9mWsnv3SgzOq0w2LaBkMfPXUwfJVAC7KS1tgz4+l0QI9nPVwHPI8fQbiGCzy4qXIUofc+W6UFQix3NBE/9aioquwK3g7bJ+lwuyLQt1WUjZekFyjWP02GYyegwrKS52K6EtWogS6gpGSKf1OMnCfMopRgn3wxR567UHDh7xut7rWiRNmwW03JC3bkm2bdNzziXYFwP3oAW7i7dtRIw5c76OG7x8Gc3NszHKq0v46/dfgoyllg1BPHcCwXiyL3PccSYIR889dVDceNu6du0iZAM0wvE++3tU4hhh+PhKbLwNTX7uBBysgzlO3+Sot5Y9dvu6IDy4kOCseqBlcHFxFJTQYHLhrWzajmySJiAKpYuPE8jRe19sgH5xeRMy7jveTdjZZ49FYLiC5sftiMuDq34pxJ1hIzCePXtc0FgpKiuncsQRx1JWdgw9eoxm4cJlyMbgdASWzo+5DG7+r0aCXe1AXxd5A8yilFg/go2Xh11zfizp9H24ZPyBA7OyQZSGRIl9neBN6WAEHeI+TICbVphnIsgTP/f9JonJyOgi4T93YFeQkn4AIy/irWPajQKCArvyS6ITDMN2+OkzrsQGD2B9vfibRVli4wloQ1rodu5sJyHwT9RqhHmuJ2phDgIK9lqKbOxT3d4UMmn/B5kkrwJPoZVCSLFnj7Q3kUjQokU1RrgG45HaC054pKyfXJl2/JnQpiOwRudhLBGPA9Ooq5PJpgWULFr+etqC6u/s2bOCoDSyuaTLehIR6E8Td3Nx4IBLiU1QWNgFDkKq2Va/scCtdOmSoHdvb2YfUfD071ykrRNaqLjKngbsc/QP2Xs/woUr2KmTjK3xiU3Qo4dYXIqKTB27dVvA8ceLEuryiTVKrJTxjW8YJfy114JOMiqzbXkJtwU6aJE0/aIxWfW7vUpsNXv26Dn3fdwKqDn9cFlim5pSKHU18CV27dKWOj/V4FVeXcJfz9dyvDjCro3edGTuXo5rzMrLr+eGG4xFW/OhUbhdMrA4+7//ffp7FL6xYGTq98WTkTKmJ5ywgIICGdMjjxyXteZ50RWM/EhRU2PSsw4ZMpa33vIrV2YTKVn1TiQYE9XfXr1BDFIqQcvgoiI7Ta2LzqCg4F2CNxvXIrjIeoOQJHfeTkdO77zCxFbeRObmKmTr1j0BhFnsVyObIX/9dVn/gyhoJvW2sdQJqsfSpa9SV3cfjY2v09j4H+rqViKwWv9GsJ+HkcszLjn1NDLfL0MU4CBMZu9pTdB6o8lWYnONHK55YMel+OlzfPCB14AkSmw9wbxShMR19MOdjnkKshbb/FtNMF65PpnczAcfjGb16mMR/h6b/djy0OaJv2AyIK4mzjoWZomV6+GbDX9iFkH/CHrv4aXPpBKrU+JFKSIrV9Y4ldjSUvM9X0usfl6gYPrgVgpr0Ni1Yq2Ld5xik3eR1QxjM070Dmz3btNOWfzsBXcwMumGI6lqT6ZVqynYC07QztilAHjL1nWzLdSvZtDbVgwAACAASURBVK/7J/4E4DYaG18GpnPnnbKgKTUW2QjcjVZ2CgpGEzeNbC4lkGCInyACPXph0+RWYqGkZBiycXAJtAns2lXH0UdXkpsasRdhCoQIlIrQso2gnJ+1sovi0Lu35DCXIDujmPbqtYCrrpKxNZZYKC4Wd5q2bU0dy8srWbeuChjL00/bC/BbwHROOmksH3xgrm/b9hZ6ARs8OAgEPYEE0VyFKGudsn3xBJLOtwCBaQsSpE/T3LyXIUPMux96yNRJZME5yBi/SpTlI5eHk+zYMRFR7h5EAllc/OFXXl3Cvwbhr4nIIvVTvIlX5H1mbJciCVUWIkeVx9Gv35n07y+Z0M47T5JQwHQaGqRPDT+6FhNdN78lRwcj+uuVq1yceGLlwffE3+gnOP/8agoKhJdmzFiSDQbx4twaq+pE3nvPm561ttZ7DKrrkE7D3r01CM/4lSKNiRp0JBp9pF1cTDb5RJA1+TbOPHM2paWaf/199m8Mz/VGrHMTENzOQdn3v4YEntZ52perxMax2Ps3t+8hY+qvvx0IF2Spm4FsuO5wPHcqYj0eyvDhHSksvMLX/sGIYcCWU32R08A7EdcK261rBHA6/ftfh/+0Jq4l1mzCK+nUSbfXr8ylCLdcG5cZTaLE6tMiF60H2uINcPO7p/wO7zoUlFHNnv/PAU1kMvch8INLELk4BLNO2DxRgciK64CtoW3U65iNAesO7LL7Mncj7U/MEu56c3jpM4FOYFMymeTUUy/ImrLDsUObm4ucSmyrVmZAD9WdwByDKXKTMGzHYALqaPn8gIK9x2qubFjRUejaEgt64dCKkZ6Ev8ELWn2Vp5T83Als9ABdN/vaDryRs2CE6TXAD4AJJJNVJJN2VPpUtLArLBxLOh0v+txNszG+cS7UBhtBYmP23YV87nMbqKvLjSht3bqSxsYzUOq3jnaNYP/+e3nzzSq8qAirEYv6akw6TI2CsAJZiBYix9VfRnA2c8uWvpSyO3SoJpmUu/fcA2PH5rb82GOF78FeBAwfmzFNsmrVBTQ0SESsibZ/Gom6nsPbb9uRsk9zyy1yHaqyWLV+FAW9UA1GBLb2zS6iQ4c0+/dX0NCgkR9cmKxPAdewc+ccdu40SA2rVpk6GVkwG8GtDBfsroxw6fRNyILu4g9NfuXVFUFfhHeh0zjCG60yZ2A2ZGCOmgGWkEpdx+7dtwB/w0TUr+Kdd84A/khT0+Dss67FRNfN34Y0pu/LMRvZNIIikkGU94UH0w5rJVZHdEfR/v3mOdfGL53WvBaGBOBNlGE2XUUYNwEbMUFjewfN6XeJwkzVJ1Z22e3aNVNQUMuePcWk011ZufIm+vb9AmvWzEPzr5YJpaV9aGzU79Xjr310/dHlL2HPDXtDJUqsLdt1G15FrLgLgV8iCqdd7hjEncDum2bgv3jlj02fQ3Bl30MMMkEGof7AP1mzpji7Ll1OYWEhmUw7oBWy+bXllJ1851xfO0S+bt68EYPmEG400WRbYjVu7g9/OJ+f/rQKs+aCQXHQlmuXLDAuM5pEiS3GrFn+NeE9xKoatvaOQMZFkx+vXJPN/9NxI27chqwB15GLKDQY2SCMDW2jNpL5LbGajHKbYOrU+dx1VxUffDCTLl2KSCaFt5cvtxPt6DLCkGkOL33mLLFeX4xoPw6txNbXi/X2738fy+7d47nySrFsSOrQ+KQXfRl42wpj+zZ2s+qVT/BLEOl2+tsbvlDv3u1XYisRJcm1Mx/Bvn1aMRLKz53AbqedCU1fayZYSC7DCMFgvx7xiczfNcOQbbWyx87lT7UUWTguYu3axdTW5h7DFRYmKC4OC8A6JZvO1aapwB+AvyILku1q8FuEN1T2ue4YYeo/mlyQrR+0aGFKD8uyVl8v5SxdOpYLLpByamunk0qlrDGtziqwub6gJhuM93om47ruHTtDtl9zmnS6KAsDVYUo7rknBHKU6X63ua7nRpDl42BP4D790LzhDz7zUwWihGjeduVDX4OX17RsOCdbZpSf3DJ2774p+5v/wfDkc9kN0wXs2aPllksG6rp1xnv83Q8JKtRW4osxPuP/RjZGklLIVkSLinJ9V4No927Q/Pqzn+lAM2OZN5bY+LEC2hJr0o36/ciXIlblTlZ77TltB3m5ZbA35Wcl0Js9ezZTV3cf6bRYx+rrn2DNGm/gpz5dkf7R47ABr0+y339yFiZBgMsSq3nQxEJIfR/ItuEWck+khuANlpyNBHpFbeh2IIqZfqdf1oxCTkja0dBwHwIRtYZMZjViac0gJ0u2DKzA60Znj4VYphsbeyKW6dOB7wJv8fbbLvcLsz7bSqxW/Dt31u3tTu5JoMu9QtPLtG3rNSCJEtsJmTtLyF0TuhMc4KbJvw6ls+3w6wC25TjIDzcB/JaCgh/iDh6HXDllj99oZOMznfr6VIQlFtq2TdC1azUwh4EDB2XLW8PIkZO57DJZJzSFu94cZjqsWAh5kgtiywuDEg45MnnyNDVpkkBcHHWUG+KiRQsBHNfkLst8tm7V9RBoi9LSOKDrNgTGKAUnqBNOCIbxyv3oduq/tSoaTH+MOv10pY45RuqroYPg7Mjf6e8ueCUQwHL376WdAsCd8VyDY0LaFxe6Ju5zQZ8gyC4XVJYLJsfwFkxTnTsrVVISDiHTsqX/fhTo+VBrnMepcHD3oxUk1YABpoxHH3XX44wzalWHDu5yystHqqIizYtBfRx2XcMaeSFnBBzdPyZB7VmiYFBAO4N43SULxqlwufCC8kJ/+XnDhv/yz+3tCr6mBNj9BZWbPKVCtWr1HSW844Kx02VeEHDfbtdUFcx/L6hevXQbgtqaVDDequt7Cj6vBHoqun8uvFDkxs9/LokAbMD4oHkPY1SbNmcr4Us3nNC3vpXMJmqID730/PNKlZWpbJtXON8LX8q2VQP/++e0XwYPU3CaEnk4TrVsOUZdeuk0JXBcI1UwdJqZ//a19u3tutm8FJQgYLnS83fWLFPO9dfbPOiX+3r+uOaDH8JrWvYdUTJzqDLwWa66XpPtiyAeuzjbl/7rdh3tdcvVF4tV8Nw38GPDhkn53/9+Ul1wgYxlt25a3pxmjVfYHBYIw5KSkerUU73r73/+o+v6ZLY8//zT9+y2+eGtzlUyx/wJafzPHWeVGwaxNy1bj6Bx1G30J7vw9uORR45UM2ZInR54QKlbbpHfz56t1L33yv+33aZU797B641OzqKUC4ZNqf/H3rfHV1Vc+3/POTknD/KAQHiDgYQAIbyM5SEqIDRiNIj1AbYVQe2Dh9XWgLd66631UQu17bX1UetVaytqa9V7BR+tWrEKyrW+CW1/olYtkhNFFFAEkvX7Y+3JzJ49M3ufSAJyz/p8zic5++w9ex5r1qxZs9Z3Af9Lur7WFYQufVuGZFJi/ViQduzQoiLu8PnzXYKeBZLIPKFinknsNz+j/+tfXI9Ro/j7EUcwc+bkyOfy8hYTC1Uzpmm3bmlf1hrXosBlziAWFCJjzHyyCxa5ENXWEo0fz/UNLg5mrDsW6nzvOeeY63fNNa7n0zRkiKm/Xcpz1AUtLGPKVGN9ZF11BdJ2PdomoayMKJl0LxL5+boSp2P86Z/DyY+nasOiFQtIrYefye392c/MG6P+/aNiutrGwna9jlwZlFR+co+hWHRN77ApfCZZMI3cWdBGkHnzqCsOOo/XEWOsmrBXq0lkFWP8XH0RVz8biRdsF9/UUdhCmZMjFkqbDFxN8fhw4kX3QpK4qXUh72benjeP5cb3vkc0aJALK1Zf9FzjuI5Gjmz0MG6jb0jXruXMY7Nnq221LdgPEs9nFw7uu2RXtAU+c2Yb5sMOU+t2vPesbUMlxnMaAZOorKyeOAvXUiotrSdgHPkVF32zZpsPqjwTMi1s3k/y7rGtKTZ8WHXcTb+rRgDT3Io696VsGj2a39u9u23ch3vv1OWCf51KpcZRRUWajjnG/65XXuH78/OFHLFtFOZ67zEpfFu9fqz23inWbh0fWJSfJuZFG68JXnKvfanUVArD2Z4wgfvx1luJfvQjvn7bbdSe3euaa8jLROjWlQQJnUlg7B8onFh06dsypHBLbJBJk0m2ZH35y7xjYEXMLZCqqmZ4uwoh8AXDTycWBk3t92/ZwvXgCUV09NGcMq9bN1WgmSfPkUeyUpWTQ/TTn9qE0ALidKMmS1UNDRgwzWP68IW6qoroC1/g+vqFUrh1ACA680y1XotJpDqMx0WqQ9MiMIUGDTrHK+cppW6uNLyuxADqgqEv2Gmv3COJrTCmhBKTiDcU68muEOoKmmuhkM+UlREVFbknfa9eutXPZYnd6o39eKUe0w3323fLvXqZE2h06xZ1Uc7UEjvWMa5Pe79HKcdVv+MjPpMmaUExbbLmE/Ox6R2qxcQ0r86kKCltOV0ykd2SL3jLxTejSPJflGQpprZO1cZFVSTCefv001luXHwxp8NMpWz36u1w81mPHvV07rmm58z9CRA9/jifJH3lKzzGJ5/cSMmkvmCbLK2uOtueFcpvJimViQYOVMsRdTMpgFGSwggenGl4l02p1OeyaqywJVQRm8xmYiv9SEO5DZa+UMfPpqgLy7B+ypHJ3JeyiQ1HbmUuN3cqhZ129exZT8OGycRH4tPUxH+PPTZN8bjNOirWwgpimaDOMdGP85UxOJ6A072+raMhQ9T5KYxSox1tmqm81zyOFRVhqef53r59uR9vv12m1b79dqKbb+b/r7mGKJFwl2FKeuDS17qCPnc+sUFfDNU/6ruoq5sFYCXy8tgRmX1i3b6UW7e+j82bG2HyQWM/xXkQvjkqNAXA/iXJJLBrlyyR/at0v601+Pa3OVLXjAnHMCfs03U7gv5/9QB+idraIwAMgwxw0CGc7gP7KJX5fGIlqfi27uhK9tUS9XoBwA8BHOf5pt5meH4ogDa8/fa5ANaCoUCEn+ADAL4Os1/ae3DhZMrgNxWaqQ7AMeDxGm/psyO9vvqh95spercNQfzH6H6VpaV2n+c+fS7BgAG6z7Pqt6eS6OffQPp32bBo7cgU771nRmmI7k8c5guqUw5cPsHB2FFbPVz1U6N0XXUqA/B7sP/j/wPwI/D8u9+79jaCOI6CliMWs/m4jgbwKsIQDwDVJ/lSDBliiv5/DsxbJj+5ZgBngX3uBP/ZxlpNlhKUNZy2WB0X1U/dDWUGtGbgE6v7trr5rK0t0Y5RHDVWYN8+XkJZlpehsXE5mK/EeAify2PBPospSN9yE200PCt8H0USiOgg/YCQlWIc/oTS0n8H+yTr/pOm8dSTwgg5J5Bt1Lro+NC6D+sMMMKGSPzhSqhyNxg263XwulGE4NipcH8qvQw57qaxlOnbY7HXvedV3lDrrQZl6SSTSPy//yfgu2y+1LO8dPDC99xEz6Jfv+r2tLMi1Swg18r8/DIkEqWGNgPcnz/HkCHliMcF3J6g74Pbvwh+fOpvA+iORKISTz8t5ufvwagsV4LXcttcEHPVPI65uUuwfv3dyM0tQ5S5J9pp8oltawOCCST8ZehJDw4G+twpsStWLEdFhR0K4vzzWfiRx38s+NwCaffufeBAC5tiJ/Ji64FdzAAieEwE2AQVR6bCQvFfC1atWgYBp8OL5DQAA8FBYXalYONGNVOTafFqBC+GJ2Dr1tl48cUTPDgy4ZSt4tvK+kiB8iOwoFiGHTtavPIrwEqAUPJtmZVWggVyhfd/E3ixSXlt+gLUYKbevRsgcm7bcDKDwW+izeMhg3r0nORqe1S4JZMgGOv1paoM2RIJCFoPoVi3tckyy8v9eLBXXKED/gMcPCMw/tS2LoNEKxDvLoMZUzbzBBociRtlUV6O/HzT/JpuqXcJ3AtQH+2arR6u+i0AK3c6f0wz1EkunhwZPRt5eQ3o2dOUgEGlMuTlCd44GxLtYBw4CnggomwCZJBOGR588G6kUveid+8GdO8u+GI3eHxfh58Xj/Paswi88RI80LFkKUGFQV0Mj4XcFOhK0NEA/omHHz4Ow4fPxs03n4CWliB2q/k9QJisjcVa2yPLGR7ut2BFahh4s/JNcDKQH0DAp3EQ7mzcf/8JABbjtNNOxd69Oga1boSYBfvGWM1spSuVNug0c8CM6Bd/ZH0Zzj77bnTvXghOgKBvkCdq5ZkUM4FsoycMUAOFTMFHj4E37SLxhyhLXSe+B96ciSC2RkjsaX3sqsHKuNoXae8j+tAmV/8M4HH06XM8/GgZ+sZBDYTWSSaR2LNHwHeFwWbZN0j9+i1Da+tuvPXWCXj++dnYt08GkKmwm8mkGzf1iCPGI5XS8V/Xgde/SWDDzDKvP64CkIvW1j/hww/FPCqDzMo43rtXGGfGe/33He/e9coz/nEcNeqLKCsr8/QR99wTmf/cSmxmSQ8OCupSu2+GZDNPq74YeXlsnj/jDPZr/etf2fS9YAHf+53vhB9dFRdPCjXFiyMNEQN2+OH826xZIo+8/FtTYz6CWrtWPU5aQ/5jpXoCainsGKu83BW40kz+YylRd7+DvN+fy55XvKBAHDfpvpm2OkZ3VQCIFi9W3x30M0wklpLpaFy+S5SvOsnrx3VRjgX1o5p6crtrVBKwlBKJekokpD/qgw/663rnndJ32v9pImCq5/pyOPHxV7XSBzNIumOYXCAyO+oEiHr3jn58e/TRaSou5uPVeFz1L26ioK92uO+w/1qmfnGCp4OuPuzWIgK1+PqwYaKuciwmTyYaO9ZUP/8xPOditwVcZuYjCbD/fG4u0S9+QXTBBWo5Jt5S3W3Ue8KP/s3tqvXqK8pRA5UEv4vjzPXavUH5wbnfo/SL2wc0mZxExcWinzcSH7+aZNZqkj7I6nURNKu+V5dPahtNcQnV2rOm+ovn1xCwiOw+tFMIWOrxjpwr55+fpjFjiCordbcSU7CmbT6LOjygtEW0U3WdMT27hli2muMy5Fg2k9vdKq2MkRo0FtUFjGjqVNEOwYO637mrHfO139zzMDdXdT3TXWwWUf/+oq3BcWxoWEpAPXXr1kCxmM2XlfvvpZfSVFCg10W4Majj61/XkslqEv7zQZcPfT4S8Xo6mfyuebIel17KCsmUKS7ZyjKe3RmJ7r1XxLUQ3XEHfwAR7BXdJzaqvtbZhC59W4YUpVMmT+YO3r6dv7/4In8XSuxFFzGTDBpkFmgFBdOpqqqOgoJEnwTsa7tpEzNNbS3fd+KJHL0LEA0dyn/HjzeXMWSI6qumM4uIWHRP0srKerILaH3C+xlQKiriHc0kAxlMzwif0gYKLhqmOkYLZBACJZkc5Xx3To4pilx9ly48TJMwqvKhjpUIrDAJwtO89wUF4cCB/oX+t78lqqqy1Z95dfBg8V0PkBL+vlOIlWZViNl8RIXQG6vVuZHGjWuikhLzHCgv99d72jSiigr+v7DQVn+TcuTiOfFpIl4cdKEsIpT1RSMqT/Nn06bgfdOnmzYTLtQHk8IWfRMgPq+9xn9vuYXowgv1ckzyRdRDKD6qMhrGv7Zxsfn6mpSHzNsYfEZ/j6ufa8geoGrb1Ki+veqm2jTPRR8fT4nEeEok6r3AlaXas+r9i0luIF8h5lUbj9uNBiUl02no0CaqqlLLE+OlK4suGSXm8wwCxlEsNoIkAoNLDrR6zzRSbm49lZbqwa6m8bOtK2u8NozxkGdGGNqgfvwIILNmyb7l+gsFWPDGgxTkzQu9+9SgpzCFd52HEhH8rbTUxd+2cRRBgnVUVdVAw4fL/tuyhahfP73vhB+2uB7mz64GO7valiZgPpWU1HqB7bIeP/4x6zlHH8335eSYZfyAAdPbg37/53+IfvITLnvVKqK77uL/r7rKxQPrfOgEHdXXOoPQpW/LkKJ0yqRJPAAffcTfX36Zv591Fn9nyBKiZ57xR9KVlzMj1NcLVAI1gMYueMvLeSC/8AUud84cEcglIUAmTDCVISamsALogqvemzBu4XDqqWKSpmnsWF4E8/IavB1orfIuXfm6kFioqZPMFjikCtDhSjlhi129oV22vpxPYbv5eDxo3TILfjW4KIplSAo9VdjK4BWXFcel9PvLu/12ubExfV5+WfKOO0BqNfHCJcbBFoVqX1Rzc6fTV7+qW1LrqaSkkV591a+wHX00B/PIPjHx01Svvra+EoEjatnqomUKoJRW1Zwc8R6TEieVE7nxY6HOMDn++nbrVu9Zlm2Lt3scw3nCbKUUp0J33UW0fHlYOWogl2r5cskDUz11pVWdYy7F2TR3/PPRZG02t0dGaMfjrojpaY53ujbK+nuPJ7s1kz8DBzZQ//5qAJaOJGCynqkBWqa6uKLqV1MsZjplGk1BuRedFy++WI5jKjXe8oy4ZxwB9ZSb2+AhIJhOGfS2mY034rlTTxUIQa754D9xO/FE+b76ejVoSlcC1VMo3UptU3jFe1kxHDIkOA8BRtiwt9Ud1Q+w9fHDD+X1rVuJpk/XLahjyb+2h8E0TqXomxkZVKVe/+lPWc+ZOpW/Dx3q13NSKR73hx5K069/zfc8+KAMLL/zTqLf/Y7/v+IKUW4TVVRM9cb+cEqlaqiycio1NTV9Zn2tM+hzl7FLJyL+q/qoqteFv2pZWZmXApFp3TpgyhTOYrRixXLcc8+x2LlT+Fbas8m8+eaVWL58BeJxLksEdgFAURHar/nLEBlErgLwDwSzbwHse/QW2F/tYgSzFj0DYAEuvXQd7rkHAMpw2mkr8dJLwJFHAh99BDz33Gywr5UpS8wGsC9NC2SWIYLZmR9enc+A9NV627s/BnOWojaw79QW2AMZ1L58z/FucY/LiXwI0J6FZwo469c1CParra7Pgv1tRaaoFrS1qdlZ4kgmv4u9e3MB5ALt2brU5AZ6Rpd9XvtbAJShtdWWotdrYVzNGOcKkDoe8fh/oK1tjfJeU5tUv9r2twCYhE8/vRJ//est0LP39O8PdO/uf5sIegCAPXtU3hUJCX4EzqIl/Aj1DEqiH/4Evw+qygvHw0/rwT5hKwG0ID9/BXbsaILkOUF6fVT+Phnnnz8c7Jt2a/vvu3aZMoiFZ7zzk56Vj7M1lZdX4803VV9byRMnncT3/OpX1aipEZmJzOXIIJ6V4DGs8O55ETxvbwbLJhv/ChLtEuMyG/Y5ltR+60gyEVt7qgE8gWRyAT791BYQ5wnMjAL91HgA8d4tYDB4nVcEtSGZZF9cGYDFz8bjW9DWth7sq6/KqZVgf9XJjrq4eOjPIFIzFIp51wL2R+2IjJLBbcBKVFaegKYmU5vFHLkBwER8+mkMLS22LHp624TfpaDZvu+FhSJbk54dTIz7SHDMhJz3ahBzQUEZ4vFStLUR/P0n3rsM/kx2IkBN/PY4ZBrbfeAMc0nv/1q8884C+HlQZFfU26rKkSa4gzavQEtLC779bSnrjzmmFR9/XA1Oi77IK+dOoD3ZT4tX12sd5ebAv9ZnHlSl+vECHJSm6jkjRwJ/+xvQsyfw3nt8TfWJVctgmZ8GsASbN1/t1SmGPXva8NprG9DQwEFkevauA02HnBKrp5HV084KUgO0ysrKsGHD7zBx4jzs2HE9OHrVvsBt2HAFiov52759LWhpYeZ+4QWePJs3V4OjN0UZ6uKtZ98S3LQc7OR+BTiI6g+QwmEHOJDgaPTpIxkoN1f+ZcVZTStpSucokAdWQi5wBUo9VKVsC3iCDgNHzW+DDKDSF6494EV4ImQAiWiXTdALQWN6NytCbW1SIQwSgYMRrgFwKThI4EZwfmv1/WpdLwcHCvQDCzghzFmg7dvnV4z27t0AFjK/VeoglAKbMiVTSra1lVmymzHFYqow6QOXAEsm+yiR7/7+79EjgQ8+aAXziF0Yb90aTMu7b18wA5vIkMQUthkT9dFTW85GcNyiKI78Ds5YtQIcSa2Op21TxMgYf/nLPgC3GH7X05mqGYpUvhOLn2nggu084gjgzTfFN9E/ywAQ3nmH08U+9thf8Ze/cLpYXuT95eTlAbt3L4MM5BL8pCo+K7z6M/8WFlZj506T8vwu/OMioqxNm9t6+PvWlUrSlunM3C+C3NHOojzTO211EYgUQg7xpoc3/2qApzque9DS8gGIliGRUDcTKzF6dAvefnsutm0jBHlT1N1WF1fbNsE8F8vAcz1TGcWkBg1PmFCNpiZTSvOVMKcxDab0zXTMi4r09+rjvj5Qlrr28v8iaMrUf+q6mYYMUHsBnG3OtHltBK9PX8HevRO131gWd+tWprVVlSN6EKQuD/6JCRNOxZtv/qj93f/4h5oWPRc81sPAgYVx7z498EulOHjt/S8IOZ5KvYU9e+xjYQqq0vUeFW1BJT3trFh3iMT1FvzhDyvAhofrYeKdzZvZgKcqyQcDfe7QCXTSlVh1cAC7EqsP/siRI7F586NYsOB+JJNuyI99+xLec2k8+uhcfPghR1l+/DGnJm1uPgX+6E1TulMTVNi9AD4EcBf81r3B4MXoRz4hJtAQUik1De7zsEczT4aMZhYL3EjIVJhqxGh/yIXiPjBTz4eMEC8DW+QuAU/0h8BKrxr5DLgtKrZ3C2iS6yFSvAbpTTB0kogm7wZGXfgEwahksdj9OxiCZo33XSwOdsiqYOpUIQgvRzD1ox/6qK2NLbFqWliV/JZYeOWaqC2wOVMjVZcsEcgUbqEpIFZUCldiVd41bcbM9TUrPFEsffpY6PPEFq0vkDHeg92izdH8MpK3GUG+ewDAl8CnIraIfEn+vjNFyTNU3549KlSfHxHg009PAKf//BrMKS3FWD8IRklYg+7dVf5V54+afhOQ/Wfi8VHw9607IltC3WVCgk9Em1VEljcQjHxX62JCF1gOPnVRkSpEqtAzvetb4R/XP2Hnzg3YtesU7Njhlye5uWVYuvRuMGqETZG29YtrDph4XfRBM4KQcWKMvwezjGIS6xnAJ4hFRaYo/OcQNgckZTbmhYVuhKBEQqDJSB7/4x9lGtm9e1uwb59AD9ChDXXULSo9HQAAIABJREFUg5Vg2XuJd90moysgN65m+V1QoLdVlSM21AQhD2rx5ps/dJT/ESQ02j1eWX9FNJhGKce//GU3NBjDi/pJt8Sq/AH4UQhMaWeJgB07uN0vvXQK7MhDABvwbGgoB44OWSVWUJglVr0uXA4qK/WFQCXeEfHzK7Fzp5hYOqTGHqUMVaCJCTwdQRiQ4QBWICfnBVRVtWLoUHjP9QYrkmU+JZYtsS146aVleOGFE8C72BaEKwqChij1WAa5e9fdHcrAQmIdWHFsAOelbsDgwffBby24FCUlKj6mSdC3gLEMbe8WdVWxMHVKeP0iIEceAVuWrgMLPV3ArgMf++i4rYAf81Ank9B/CHxU5DqCegG33LIM27adgD17zLnA/UqsezEpLLQrEPn54r9weCOdWluDSmxbm6rEqnygwgPtghm7letrVnhs9WsBK39vIAg3ZILLiWnPLvOe060qOjH/s0wQR43heMl2asFzz6nwVA8jHKrvP6AvlET/BeBv3vuEW4GJ5ObA76aiKqg6H4n+02H1xG+NYPiyevA8WOjVq1Fp13QwxvPZIf0RpFRKzJe5Xjlt4GPul8FY0pvBUEI6dNtUMLSafv019O0bR27uXSgra8DQoQK67HmwwnE/CgpmwbzBnAQivzxJJIDu3VWLtUqiL22QTT1hnwMmBU2M+x/BG2oTZrYOKegn1dJWVlaGk04yYYWbFHJB6hrQAobVWoho8IasxJaVlWH9etN770VZ2d1eu0Vbb8XOncO9axtw772TwRBlcQD/gr//VkK6hQAsb2aB15e9sMvoFoRhOLM7wXIMHizGUZUTro2ecH1zlf+RUucyMAbsdrhl+noA5VA3s+vWvYCiom/AxBcVFZdgxYogX2SixNossbfdZrNK63Rw4sSiSz1wMySXo7CA2crLYwf0kSPracGCRlq/Xjig8++cpaKBqqrq29PLEhFt2MBOzPPnB9/LgV5umAmOBlSj/E05p23BRqoT+zji4KlJxNGKjfTVr3Idt20Lvn/XLvn/tdeaAmVc6Rb14IzFxAEkaygYFObOeiLKOeOM4O+LFknn8qIiEekvftcd9NV3R6mzywleXAsLbFM/zd4Y2AIkiIIRzDXkhj5qJlf+eBH08I9/EA0frpZrDxyqrTUHLABq9jdTpLjMYpRM1pI/uCNN+fmNVFHhRzKoqUl70bx6P6vwQA+SzE4jAmuO975PUd6hfkzzKgrckDpfhin1UZ8NywokeYkRF9KUOTyYq96if8LeP9bQB2oASFgwCAf5yPHR+V6PhifiQKsjLG3QIYde8frFBJFng9myf/r3F/PFhMgi6juKGIFjOHGE93ivH/yBiH36MH8+8ECaios513tzc/CdAwdGD1A76iiia6+18aaYk097feiHAATOIVt68URCDwB1z01u91TiNcCGJED085/L/4mIFi0ytTFK++0wUGoaZb2uZWUNVF1d762R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gJqaGuuzo0ePxssvvxy4HvZsv3798Nxzz+Hdd9+NWs0sZSlLWcpSlrKUpSx1MfXr1w/9+vXr0nfGiIii3Pjwww+jvr4ed911F04//fT267NmzcLGjRvx1ltvIRYz++PceOONWLx4MZ555hlMmDABALBv3z6MGzcOxcXFWLdu3X5oSpaylKUsZSlLWcpSlv6vUGQlFgCOO+44PPfcc/jRj36EiooK3Hnnnbj55ptxxx134Iwz2OfonHPOwe23347XX38dgwYNAgDs2bMHtbW1+Oijj3D11VejrKwM119/PdasWYNHH30URx99dOe0LktZylKWspSlLGUpS4ckZRTYde+99+KSSy7BpZdeim3btmHkyJEBy2xbWxva2tqg6sapVAqPPfYYli9fjvPOOw8ff/wxxo8fj4ceeiirwGYpS1nKUpaylKUsZSljysgSm6UsZSlLWcpSlrKUpSwdDBQPv6XraefOnbjgggswYMAA5OfnY/z48bj77v2PGZmlzqHHHnsMZ511FqqqqtCtWzcMHDgQc+bMMcKgPP/885g5cyaKiorQo0cPnHLKKXjjjTeM5f785z/HiBEjkJeXh6FDh+IHP/gB9u3b19nNyVIH6Oabb0Y8HkdRUVHgt+yYHxr01FNPob6+HqWlpSgoKEBVVRWuuMKP95kd60ODnnvuOZx00kno378/unXrhpEjR+Lyyy/HJ5984rsvO96fL9q5cyeWL1+Ouro6lJWVIR6P47LLLjPe2xljm06nsWDBApSVlaFbt2448sgj8fjjj2fWiC7FQohIX/ziF6lHjx5000030RNPPEFf+9rXKBaL0apVqw501bIUgU477TSaNm0aXX/99bR27Vq65557aPLkyZRMJunxxx9vv2/Tpk1UVFREU6dOpYceeojuvfdeqqmpoQEDBlBLS4uvzCuuuILi8ThdcskltHbtWlq5ciXl5ubS17/+9a5uXpZC6J133qGSkhIaMGAAFRUV+X7LjvmhQXfccQclEgn68pe/TKtXr6YnnniCbr75Zrr88svb78mO9aFBL7/8MuXm5tL48ePp97//Pf35z3+m73//+5STk0MnnXRS+33Z8f780RtvvEHdu3enadOmtetZl112WeC+zhjb3bt3U01NDQ0ePJhWrVpFjz76KM2ZM4eSySStXbs2chsOOiV2zZo1FIvF6K677vJdr6urowEDBlBra+sBqlmWolJzc3Pg2s6dO6lv3740c+bM9munnXYa9e7dm3bs2NF+7Z///CelUim66KKL2q+99957lJeXR9/85jd9ZV511VUUj8epqampE1qRpY7SiSeeSHPmzKEFCxZQYWGh77fsmH/+6Z133qFu3brRkiVLnPdlx/rQoIsvvphisRht3rzZd/0b3/gGxWIx2r59OxFlx/vzTu+9955Vie2Msb3uuusoFovRM888035t3759NGrUKJo4cWLkeh907gT33XcfioqKcNppp/muL1y4EFu2bMGzzz57gGqWpajUu3fvwDVxBPXOO+8AYIi11atX45RTTkFhYWH7fYMHD8b06dNx3333tV97+OGH8emnn2LhwoW+MhcuXAgiwv33399JLclSpvTb3/4Wf/nLX3Ddddf5gjuB7JgfKnTzzTfj448/xkUXXWS9JzvWhw7l5eUBAEpKSnzXS0pKkEgkkEqlsuN9CJAurwV11tjed999GDFiBCZOnNh+LZFI4Ktf/So2bNgQOT/AQafEvvrqqxg5cqQvoQLACRMAYOPGjQeiWln6jPThhx/i+eefx6hRowAAmzdvxu7duzFmzJjAvaNHj8Zrr72GPXv2AGCeENdV6tu3L3r16pXliYOEmpubccEFF+Dqq69G//79A79nx/zQoCeffBI9e/ZEU1MTxo0bh2QyiT59+mDRokXYsWMHgOxYH0q0cOFClJWVYdGiRXjjjTewY8cOrF69GjfddBOWLFmC/Pz87HgfwtRZY/vqq69aywSi63oHnRL7/vvvo7S0NHBdXHv//fe7ukpZ2g+0ZMkSfPLJJ7jkkksAyHG0jTUR4YMPPmi/Nzc3F/n5+YF7e/TokeWJg4SWLFmC6upqfPOb3zT+nh3zQ4P+9a9/YdeuXTj99NNxxhln4LHHHsOyZctw++23o76+HkB2rA8lGjhwIJ544gm88MILqKioQElJCWbPno0FCxbgZz/7GYDseB/K1Flju23btv2i62WEE5ulLHWEvve972HVqlX4xS9+gfHjxx/o6mSpE+iee+7B6tWr8dJLLx3oqmSpk6mtrQ27d+/G97//fSxfvhwAcMwxxyCVSuGCCy7A448/3n4EnaXPP/3973/HzJkzUVFRgRUrVqCsrAzPPPMMrrjiCuzYsQM333zzga5ilv4P00Fnie3Zs6dRA9+2bVv771n6/NBll12GK6+8EldddRUWL17cfl2MoxhXlbZt24ZYLIYePXq03/vpp59i9+7dxnuzPHFgaefOnVi6dCm+9a1voU+fPti+fTu2b9/efsT04YcfYteuXdkxP0RI9P1xxx3nuz5r1iwAwAsvvIBevXoByI71oUAXX3wx2tra8Mgjj+Dkk0/GUUcdhcbGRvzsZz/DLbfc0u5eAmTH+1Ckzhrbnj17WstU3xtGB50SO2bMGGzatAltbW2+66+88goAoKam5kBUK0sdoMsuu6z982//9m++3yoqKpCfn4+XX3458Nwrr7yCYcOGIZVKAUC734x+79atW/H+++9neeIA03vvvYd0Oo0f//jHKC0tbf/cdddd2LVrF3r06IEzzzwTlZWV2TE/BGjcuHHO32OxWHZ+H0K0ceNGVFdXB46IjzjiiPbfs3P70KXOmsujR4+2lglkoOtFxjHoInrooYcoFovR3Xff7bt+3HHH0cCBA6mtre0A1SxLmdAPfvADisVidOmll1rvmTt3LvXp08cI2/Hd7363/dq2bdsoPz+fFi1a5Hv+hz/8IcXjcdq0adP+b0CWItPu3bvpiSeeoLVr17Z/nnjiCZo1axbl5+fT2rVraePG/9/eHbs0EsRRHGcWNIkigkJAkbCdgilsY2WRIhYGtLCNXUqrgGAlGFNELGwEBf8AtxO0WRJCCKiF5YGVYCkRq0XRFd4Vx4Vbopx3oGTC9wMLYRiWXV6RRyC/+SGJzPuB7/syxmhnZyeyvre3J2OMWq2WJLLuF9lsVslkUkEQRNYPDw9ljNHp6akk8rZdu93+cMTWV2R7cHAgY4yurq46a2EYanZ2VplM5tPP3XMlVvo1E3ZsbExHR0eq1+scdmCZ3d1dGWO0uLioy8tLXVxcRK7fbm5u3h2gPDU1pYeHh8g9y+VyZ4Byo9FQtVpVPB5XsVj87tfDJxUKha45sWTeH5aWlhSPx7W9vS3f91WpVJRIJJTP5zt7yLo/nJ2dyXEcZTIZnZycqFarqVwua2RkROl0WmEYSiJvW52fn8vzPB0fH8sYo9XVVXmeJ8/z9PT0JOlrsn15eYkcduD7vpaXlzU4OKhms/np5+/JEhsEgdbX1zUxMaFYLKa5ubmuX2bRuxYWFuQ4jowxXZfjOJG919fXymazGh4e1ujoqFZWVnR7e/vufff39zU9Pa1YLCbXdbW1taW3t7fveCX8h7W1ta4TuyQy7wfPz8/a2NhQKpXSwMCAXNfV5uamXl9fI/vIuj80m03lcjlNTk5qaGhIMzMzKpVKenx8jOwjb/u4rhv5fv7z893dXWffV2R7f3+vQqGg8fFxJRIJzc/Pq1ar/dPzG+mDCbcAAABAj+q5P3YBAAAAf0OJBQAAgHUosQAAALAOJRYAAADWocQCAADAOpRYAAAAWIcSCwAAAOtQYgEAAGAdSiwAAACsQ4kFAACAdSixAAAAsA4lFgAAANb5CZEYZSZSz/8AAAAAAElFTkSuQmCC",
      "text/plain": [
       "Figure(PyObject <matplotlib.figure.Figure object at 0x7ff8f8c12650>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1-element Array{Any,1}:\n",
       " PyObject <matplotlib.lines.Line2D object at 0x7ff8f89d3650>"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(differences, \"o-\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0:0.01:0.93,[8,16,23,48,47,54,59,56,54,66  …  0,0,0,0,0,0,0,0,0,1])"
      ]
     },
     "execution_count": 260,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h = hist(differences, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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DoqLpT/9KbRrN2+Wrr1W+uIXpaeekgYMkJYskf7+76XTTpN+8hNr2woAQLwRSIE4KCqSfvtbqaMjeLf7zp3S1KnSWWeZLvsBA8z5m2+W6uul739fGj5c+r//Nz7tBgAgHgikQBwUF0vHjpnAOXp04GsaGqSrr5YGDjRd9EOGdH/93nulffuk737XhNIbb7S+3QAAxAOBFIiDrks/BQqkR49K06dLTU3Sxo3SqacGfs6//quplN58szR0qPSVr1jXZgAA4oVJTUAcjBxpKp+BJjYdOybdcIP0/vumMnrOOX0/JyXFjCedNEmaMsXM4O/55fVK//mfobXr2DFTaQ30nMxMadw46cCBiD7yCQcOSBMmSIsyGpsAABDGSURBVI8/Ht1znObAAenSS6Uf/SjRLQEA+6NCCsRBSopUWNh76afOTunWW82Ep1WrTADsT0aGWQKqqkpqaen9+iuvmApqfr4JrX3x+aTbb5f++EcTmnoOEejslB580FRuX3lFys7uv209HTkizZghvfGGtGuXaVdGRvjPcRr/596yxXx2r1eaPTvRrQIA+yKQAnESaOmnefPMTPqqKunKK0N/VlaWdNttgV+7804zS/+666RXX5VKSwNf9//+n/Qf/yE984xZYiqQL39Zuvxys/zUypXhhcljx6SZM03l9+mnpZtuMpXbm28O/RlO1PVzb9hgPvM//qMZ99vX7zMAJDu67IE4KS7uXiF95BEzJvSRR6Svfz1275OeLi1dKp17rnTNNdKOHb2veeQR6V/+xRyDhaSLLjIV1PXrpf/zf0zVNBSdneb6V14x93/zm9K0adKiRe5eS7Xr516xwvxjYOFC6R/+wXytXZvoFgKAPRFIgTgpKpL27DHduc88I33ve9LcudZ05WZnmyEAubnSVVeZiVB+4b73V75iqrjPPCPdd19o7z93rvSHP5j7rrjCnLv3Xqm2NvT1WJ2o6+f2D5fweKTf/95UwK+/Xnr77cS2EQDsiEAKxElxsTn++tfSLbeYitmDD1r3fqecIr34ohlnes010t/+Jr30UmTvfeON0r/9m/Tww6bKGczPfmauWbxY+ru/O3l+0iRTMezvfqfq63NLpmr93HPS+eebn8WHHyamjQBgV4whBeLEv/TT3Lmm+/r3vzfVMyuNGiWtWSNNnGjWON282VTqInnv73zHrIP6/e+byus1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",
      "text/plain": [
       "Figure(PyObject <matplotlib.figure.Figure object at 0x7ff8f8bb4c90>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1-element Array{Any,1}:\n",
       " PyObject <matplotlib.lines.Line2D object at 0x7ff8f88ed850>"
      ]
     },
     "execution_count": 261,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(collect(h[1][1:end-1]), h[2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## requires vs include vs using vs import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "type Function has no field particles\nwhile loading In[262], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "type Function has no field particles\nwhile loading In[262], in expression starting on line 1",
      ""
     ]
    }
   ],
   "source": [
    "g.particles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "LoadError",
     "evalue": "type Function has no field particles\nwhile loading In[263], in expression starting on line 1",
     "output_type": "error",
     "traceback": [
      "type Function has no field particles\nwhile loading In[263], in expression starting on line 1",
      "",
      " in anonymous at no file"
     ]
    }
   ],
   "source": [
    "for particle in g.particles\n",
    "    move(particle, 1)\n",
    "end\n",
    "\n",
    "g.particles"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Julia 0.4.2",
   "language": "julia",
   "name": "julia-0.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
